You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 13:27:05