Node.js Express中中间件与路由处理器的疑问及代码解析
Express.js 中间件与路由处理器的常见疑问解答
问题1:下方代码中是否包含中间件?若有,哪些是中间件?
代码里包含多个中间件,所有通过app.use()挂载的函数/第三方中间件都属于中间件:
express.static('public'):处理静态资源的内置中间件express.urlencoded({ extended: true }):解析URL编码格式请求体的内置中间件express.json():解析JSON格式请求体的内置中间件session({...}):express-session提供的会话管理中间件nocache():nocache库提供的禁用缓存中间件
问题2:app.get('/', ...)、app.post('/verify', ...)这类函数是否属于中间件?
不属于,这些是路由处理器。路由处理器专门匹配特定HTTP方法(GET/POST等)和请求路径,负责生成最终响应返回给客户端;而中间件是请求处理流程中的通用环节,不绑定特定的HTTP方法+路径组合(除非给app.use指定了路径前缀)。
问题3:中间件函数是否必须包含next参数?
不是必须的,但有个关键规则:如果你的中间件没有主动结束请求响应(比如没调用res.render()、res.send()、res.redirect()这类方法),就必须调用next()把请求传递给后续的中间件或路由处理器,否则请求会一直挂起,客户端得不到响应。如果中间件自己已经结束了响应,那可以省略next参数。
问题4:Express.js中中间件与路由处理器的各自作用?
- 中间件:
是请求处理流程中的“中间环节”,可以对请求对象(req)、响应对象(res)进行修改,比如解析请求体、设置请求头、管理会话、记录日志、权限校验等。它可以串联执行,一个中间件处理完后,通过next()把请求传递给下一个中间件或路由。中间件的核心作用是抽离通用的请求处理逻辑,让代码更模块化。 - 路由处理器:
是请求处理的“终点环节”,它匹配特定的HTTP方法和路径,负责根据业务逻辑生成最终响应(比如渲染页面、返回JSON、跳转页面)。路由处理器一般会直接结束请求响应,不会再传递给后续的处理逻辑(除非特意调用next(),但这种场景很少见)。
代码示例
const express = require('express'); const app = express(); const hbs = require('hbs'); const nocache = require('nocache'); const session = require('express-session'); app.use(express.static('public')); app.set('view engine', 'hbs'); app.use(express.urlencoded({ extended: true })); app.use(express.json()); app.use(session({ secret: 'keyboard cat', resave: false, saveUninitialized: true, })); app.use(nocache()); const username = 'admin'; const password = 'admin@123'; app.get('/', (req, res) => { if (req.session.user) { res.render('home'); } else { if (req.session.passwordwrong) { res.render('login', { msg: "invalid credentials" }); req.session.passwordwrong = false; } else { res.render('login'); } } }); app.post('/verify', (req, res) => { if (req.body.username === username && req.body.password === password) { req.session.user = req.body.username; res.redirect('/home'); } else { req.session.passwordwrong = true; res.redirect('/'); } }); app.get('/home', (req, res) => { if (req.session.user) { res.render('home', { username: username }); } else { if (req.session.passwordwrong) { req.session.passwordwrong = false; res.render('login', { msg: "invalid credentials" }); } else { res.render('login'); } } }); app.get('/logout', (req, res) => { req.session.destroy(); res.render('login', { msg: 'logged out' }); }); app.listen(3000, () => console.log('server running on port 3000'));
内容的提问来源于stack exchange,提问作者prajitha k
相关产品推荐
相关产品推荐

