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.url
console.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 请求的路径
-
响应对象的常用方法
- 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")){
//加载css
fs.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模板的使用
-
官网
-
安装
- npm install xtpl xtemplate --save
-
xtemplate模板语法
-
使用
var xtpl = require('xtpl');
xtpl.renderFile('./x.xtpl',{
x:1
},function(error,content){
});
- 音乐播放器
4. Express第三方框架
-
中文文档
-
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放到不同的位置
- 重做音乐播放器