在升级到Express 4并删除app之后.路由,我正在努力让中间件在路由执行之后执行.

e、 g.以下代码正确响应"hello",但从不调用已配置的中间件

var express = require( "express" )();

express.get( "/", function( req, res ) {

    res.send( "hello" );

} );
express.use( function( req, res, next ) {

    console.log( "world" );
    next();

} );

express.listen( 8888 );

澄清:

以下代码在控制台上显示"before",但不显示"after":

var express = require( "express" )();

express.use( function( req, res, next ) {

    console.log( "before" );
    next();

} );
express.get( "/", function( req, res ) {

    res.send( "hello" );

} );
express.use( function( req, res, next ) {

    console.log( "after" );
    next();

} );

express.listen( 8888 );

推荐答案

对于express4,第二个示例中的"after"函数永远不会被调用,因为中间的函数永远不会调用next().

如果希望调用"after"函数,则需要从中间函数添加并调用下一个回调,如下所示:

var express = require( "express" )();

express.use( function( req, res, next ) {
  
  console.log( "before" );
  next();
  
} );
express.get( "/", function( req, res, next ) {

  res.send( "hello" );
  next();      // <=== call next for following middleware 

} );
express.use( function( req, res, next ) {

  console.log( "after" );
  next();

} );

express.listen( 8888 );

res.send()将标题和响应写回客户端.

注意,一旦调用了res.send(),您就不想更新响应标题或内容.但您可以执行其他任务,如数据库更新或日志(log)记录.

请注意,express查看中间件函数中参数的数量,并执行不同的逻辑.以express error handlers为例,它定义了4个参数.

快速错误处理程序签名:

app.use(function(err, req, res, next) {});

在中间件链的最后一个项目上调用next是可选的,但如果你改变了事情,这可能是个好主意.

Node.js相关问答推荐

无法从ejs Web应用程序中的正文中提取数据

无法使用 Express 设置会话 cookie 的过期日期

如何修复node.js中的错误代码无法加载资源:服务器响应状态为403(禁止)

如何使用mongoose引用不在项目中的模型

yarn 安装失败,因为 node-gyp 正在寻找过时的 node 版本标头

错误:0308010C:try 通过 Github 推送部署到 firebase 托管时出现数字

如何避免在 mongodb 聚合中查找重复结果?

如何使用 Jest 模拟异步函数的延迟时间

Mongoose-更新嵌套数组

如果 express.js (node.js) http 请求在完成之前关闭会发生什么?

Socket IOFlutter 未连接

`npm install` 以Killed结尾

使 pm2 登录到控制台

如何运行用 TypeScript 编写的 Mocha 测试?

为什么我会收到错误:解决方法指定过多?

node.js(ES6 / Babel)中 import X 和 import * as X 的区别?

Puppeteer 记录在 page.evaluate

Express.js中的bodyParser.urlencoded({extended: true }))和bodyParser.json()是什么意思?

expressjs app.VERB 调用中的 next() 和 next('route') 有什么区别?

npm install packagename --save-dev 不更新 package.json