// 基础使用express const express = require('express'); const http = require('http') // 首先明白express的边界,基于http模块的,处理http请求和响应的作用 // 创建一个服务器,方法一 // const app = express(); // const server =http.createServer(app); // server.listen(3000, () =>{ // console.log('the server is listen 3000') // }) // 创建一个服务器,方法二 const app = express(); app.get('/test/:id/:name', (req, res) => { // req 和 res 是被express封装过后的对象 console.log('请求头', req.headers); // 请求头部对象 console.log('host', req.headers['host']); // 请求主机 console.log('path', req.path); // 请求路径 // 通过query来获取路径上拼接的参数 console.log(req.query); // 通过params来获取动态路由的参数 console.log(req.params) // 设置响应,这里的响应头,响应行和响应体,都被express封装过 res.setHeader('a', 'a') // 设置响应头 // res.send('<h1>你好呀</h1>') // 设置响应体 // res.send({a:'1',b:'2',c:'3'}) 会自动给响应头加上对呀的 Content-Type: application/json; charset=utf-8 // 设置响应编码 res.status // 设置重定向(3种写法) 301 暂时重定向, 302 永久重定向 res.status(302).header("location", "https://wwww.baidu.com").end(); res.status(302).location("https://wwww.baidu.com").end(); res.redirect(302, 'https://wwww.baidu.com'); }) app.listen(3000, () => { console.log('the server is listen 3000') }); // listen 函数内部实现的原理 // function listen(port, callback){ // const http = require('http'); // http.createServer(this).listen(port, callback); // }
express中间件的匹配规则
当使用app get post
或者其他请求方式匹配到请求后,会交给第一个处理函数来进行处理,然后如果需要移交给下一个请求,那么需要手动的使用next()来给下一个请求。
例如:
app.get('/testExpress', (req, res, next) => { // 第一个中间件 console.log('handler1'); next(); }, (req, res, next) => { // 第二个中间件 console.log('handler1'); next(); }) app.get('/testExpress', (req, res, next) => { // 第一个中间件 console.log('handler3'); })
结果如下:
中间件处理细节
1.如果后序没有了中间件,express发现响应没有结束,会自动返回404
2.如果中间件发现错误,服务不会停止,相当于调用了next(错误对象),会继续寻找错误中间件,如果没有,响应500;
错误中间件:
/** * 错误处理中间件 * @param err 错误信息 * @param req 请求信息 * @param res 响应信息 * @param next 调用下一个处理函数 */ module.exports = function (err, req, res, next) { // 如果错误不存在,直接调用后序的中间件 if (!err) next(); const errObj = { code: 500, msg: err instanceof Error ? err.message : '处理错误' } res.status(errObj.code).send(errObj); }
详细使用
const app = express(); app.get('/testExpress', (req, res, next) => { // 第一个中间件 console.log('handler1'); // throw new Error('我就要报错') next(new Error('我就要报错')); }, (req, res, next) => { // 第二个中间件 console.log('handler1'); next(); }) app.get('/testExpress', (req, res, next) => { // 第一个中间件 console.log('handler3'); next() }) app.use(require('./../middleware/errorMiddleware'));
结果:
内置常用的中间件
// 使用静态资源的中间件 app.use(express.static(path.resolve(__dirname, '../public'))); // 使用urlencode 中间件来获取post contentType= application/x-www-form-urlencoded app.use(express.urlencoded({extended: true})) // 使用json 中间件来获取post contentTpe =application/json app.use(express.json())