1. HTTP协议
- 请求报文
- 响应报文
2. HTTP模块
- 使用之前的方式拼接响应报文
let msg = "<h1>hello world</h1>";
//构造响应报文
let responseText = "HTTP/1.1 200 OK\r\n";
responseText += "Server: mynodeserver 1.0\r\n";
responseText += "Content-Length:"+ msg.length +"\r\n";
responseText += "Content-Type: text/html;charset=utf-8\r\n";
responseText += "\r\n";
responseText += msg;socket.write(responseText);
socket.end();
- 使用http模块简化web服务器的开发
"use strict";
const http = require("http");
let server = http.createServer((req,res)=>{//获取请求头 req.headers//获取http的版本 req.httpVersion//请求的方法 req.method//请求的路径 req.urlconsole.log(req.headers);console.log(req.httpVersion);console.log(req.method);console.log(req.url);res.write("hhhhhh中文");res.end();
}).listen(8888,()=>{console.log("开始监听...");
});
-
请求对象的常用属性
- req.headers 获取请求头
- req.method 请求的方法
- req.httpVersion 获取http的版本
- req.url 请求的路径
-
HTTP协议详解、响应对象的常用方法
- res.end() 结束请求
- res.write() 发送内容
- res.setHeader("Content-Type","text/html;charset=utf-8");
-
异常处理
请求会有很多很多,如果一个请求出错会导致服务器挂掉,别的请求无法访问服务器.
所以再做服务器开发的时候要保证如果一个请求出错,不影响其他请求如何处理异常:
try{}catch(err){console.log("出错了:" + err);//此处要写日志,让程序员发现错误,进行修改
}
- 实现自己的模板,改变页面数据
const http = require("http");
const fs= require("fs");
const path = require("path");let server = http.createServer((req,res)=>{if(req.url.trim() === "/" || req.url.includes("index.html")) {//读取模板html文件fs.readFile("./template/tmp.html", (err, content)=>{let tmp = content.toString();let dataArr = require("./data.json");//变量数据,替换模板let array = [];for (var i = 0; i < dataArr.length; i++) {let item = dataArr[i];array.push("<li>"+item+"</li>");}tmp = tmp.replace("${list}",array.join(""));tmp = tmp.replace("${title}","列表");res.write(tmp);//结束请求res.end();});}else if(req.url.includes(".css")){//加载cssfs.readFile(path.join("template",req.url) ,(err,content)=>{res.setHeader("Content-Type","text/css;charset=utf8");res.end(content);});}else if(req.url.includes(".jpg")) {//加载jpg的图片fs.readFile(path.join("image",req.url) ,(err,content)=>{res.setHeader("Content-Type","image/jpeg");res.end(content);});}else{res.end("你闹啥呢");}}).listen(8888,()=>{console.log("开启监听...");
});
3. xtpl模板的使用
-
设置网页中所有模块、官网
- https://github.com/xtemplate/xtpl
-
安装
- npm install xtpl xtemplate --save
-
hadoop核心模块?xtemplate模板语法
- https://github.com/xtemplate/xtemplate/blob/master/docs/syntax-cn.md
-
使用
var xtpl = require('xtpl');
xtpl.renderFile('./x.xtpl',{x:1
},function(error,content){});
- 音乐播放器
4. Express第三方框架
-
中文文档
- http://www.expressjs.com.cn/4x/api.html
-
express的安装
- npm install express
-
基本使用
-
代码结构
"use strict"; const express = require("express"); let app = express(); app.get("/", (req,res)=>{res.setHeader("Content-Type","text/html;charset=utf8");res.write("我的天哪");res.end(); }); app.listen(8888,()=>{console.log("开始监听..."); });
- express的get
app.get("/", (req, res) => {res.setHeader("Content-Type", "text/html;charset=utf-8");res.write("欢迎");res.end();});app.get("/photo", (req, res) => {res.write("<h1>没有照片</h1>");res.end();});
- express的get获取参数 方式1
//请求地址的形式 http://127.0.0.1:8888/post?id=1&token=abcd
app.get("/post", (req, res) => {
//解析url中的参数 方式1
//let query = url.parse(req.url, true).query;
//console.log(query.id);
//console.log(query.token);//解析url中的参数 方式2
//console.log(req.query);
//console.log(req.query.id);
过期的方法,不推荐使用
//console.log(req.param("id"));
res.write("ceshi");
res.end();
});
- express的get获取参数 方式2
//请求地址的形式 http://127.0.0.1:8888/zs/1002.html
app.get("/:username/:id.html", (req, res) => {//获取参数console.log(req.params);console.log(req.params.username);res.send("haha");
});
- express的通配符,next跳到下一个路由
//优先跟注册地址注册的顺序有关
app.get("/*", (req, res, next) => {res.setHeader("Content-Type", "text/html;charset=utf-8");res.write("通配符哈<br>");next();
});
- express的post和all
- send方法
- 简化读取静态文件
//app.use(express.static("template"));
app.use("/public", express.static("template"));
- 路由router
"use strict";const express = require("express");let app = express();let mainRouter = express.Router();mainRouter.get("/main/list", (req, res) => {res.end("/main/list");
});mainRouter.get("/main/haha", (req, res) => {res.end("/main/haha");
});app.use("/", mainRouter);app.listen(8888, ()=>{console.log("正在加载...");
});
- 把不同功能的router放到不同的位置
- 重做音乐播放器