目录
Express
一、安装Express
方式一:通过express提供的脚手架,直接创建一个应用的骨架;
方式二:从零搭建自己的express应用结构;
二、基本使用
请求的路径中如果有一些参数,可以这样表达:
- users/:userId;
- 在request对象中药获取可以通过 req.params.userId;
返回数据,我们可以方便的使用json:
- res.json(数据)方式;
- 可以支持其他的方式,可以查看文档;https://www.expressjs.com.cn/guide/routing.html
三、中间件
1.最普通的中间件
const express = require('express')
const app = express();
// 编写普通的中间件
// use注册一个中间件(回调函数)
// 默认响应第一个中间件
// 若需要响应其他中间件,需要调用next()
app.use((req, res, next) => {
console.log("注册了第1个普通的中间件");
res.end("hello world");
next();
})
app.use((req, res, next) => {
console.log("注册了第2个普通的中间件");
// res.end("hello world"); //前面已经调用过end了,已经结束了周期,再调用会报错
// 所以一般end出现在最后一个普通中间件
next()
})
app.use((req, res, next) => {
console.log("注册了第3个普通的中间件");
})
app.listen(8000, () => {
console.log("普通中间件服务器启动成功");
})
2.匹配路径中间件
const express = require('express')
const app = express();
// 中间件:查找所有路径匹配的中间件,只执行第一个满足的中间件,除非第一个中调用了next
app.use((req, res, next) => {
console.log("home middleware 03");
res.end("01");
// next();
})
// 路径匹配中间件 与请求关系无关,与路径有关
app.use('/home', (req, res, next) => {
console.log("home middleware 01");
res.end("01");
next();
})
// 永远是第一个中间件
app.use('/home', (req, res, next) => {
console.log("home middleware 02");
})
app.listen(8000, () => {
console.log("普通中间件服务器启动成功");
})
3.匹配路径和请求方法中间件
const express = require('express')
const app = express();
// 路径和方法都匹配的中间件
app.get('/home', (req, res, next) => {
console.log("home path and method middlelevel01");
})
app.post('/home', (req, res, next) => {
console.log("home path and method middlelevel02");
})
app.listen(8000, () => {
console.log("普通中间件服务器启动成功");
})
4.连续注册中间件
const express = require('express')
const app = express();
app.use((req, res, next) => {
console.log("home middleware 01");
next();
})
app.get('/home', (req, res, next) => {
console.log("home middleware 01");
next();
}, (req, res, next) => {
console.log("home middleware 02");
next();
}, (req, res, next) => {
console.log("home middleware 03");
next();
}, (req, res, next) => {
console.log("home middleware 04");
res.end();
})
app.listen(8000, () => {
console.log("普通中间件服务器启动成功");
})
5.中间件应用
body解析:
const express = require('express')
const app = express();
// 处理body信息
// app.use((req, res, next) => {
// if (req.headers["content-type"] === 'application/json') {
// req.on('data', (data) => {
// console.log(data.toString());
// const info = JSON.parse(data.toString())
// req.body = info;
// });
// req.on('end', () => {
// next();
// })
// }
// })
// 手写太麻烦了。有写好的
// body-parser
app.use(express.json())
// extended :
// true:对urlencoded解析时用的第三方库:qs
// false:对urlencoded解析时用的Node内置模块:querystring
app.use(express.urlencoded({extended:true}))//解析的是 application/x-www-form-urlencoded:
app.post('/login', (req, res, next) => {
console.log(req.body);
res.end("coder, welcome back");
})
app.post('/products', (req, res, next) => {
console.log(req.body);
res.end("uplog");
})
app.listen(8000, () => {
console.log("普通中间件服务器启动成功");
})
请求日志记录:使用第三方中间件:morgan(需要单独安装)
const fs = require('fs')
const express = require('express')
const morgan = require('morgan')
const app = express();
const writeStream = fs.createWriteStream('./logs/access.log', {
flags: 'a+'
})
app.use(morgan("combined", {stream: writeStream}))
app.get('/home', (req, res, next) => {
res.end("hello")
})
app.listen(8000, () => {
console.log("解析服务器启动成功");
})
上传文件中间件 – 添加后缀名:这里不在详细演示
四、客户端发送请求的方式
1.传递参数params
2.传递参数query
const express = require('express')
const app = new express();
app.use('/login/:id/:name', (req, res, next) => {
console.log(req.params); // { id: 'abc', name: 'why' }
res.end('请求成功')
})
app.use('/login', (req, res, next) => {
console.log(req.query); // { username: 'why', password: '123' }
res.end('请求成功')
})
app.listen(8000, () => {
console.log("express初体验服务器启动~");
})
五、响应数据
- end方法 :类似于http中的response.end方法,用法是一致的
- json方法 :json方法中可以传入很多的类型:object、array、string、boolean、number、null等,它们会被转换成 json格式返回;
- status方法:用于设置状态码;
- 更多响应的方式:https://www.expressjs.com.cn/4x/api.html#res
六、express路由
路由:
const express = require('express')
const router = express.Router();
router.get('/', (req, res, next) => {
res.json(["why","koce","dksf"])
})
router.get('/:id', (req, res, next) => {
res.json(`${req.params.id}用户信息`)
})
router.post('/', (req, res, next) => {
res.json("sdfsdf")
})
module.exports = router;
请求:
const express = require('express')
const router = require('./12.express路由1')
const app = express();
app.use('/user', router);
app.use('/user/id', router);
app.listen(8000, () => {
console.log("启动成功");
})