Nodejs app.use() 中执行顺序

Nodejs app.use() 中执行顺序

app.use(function(){console.log(“1”)});
app.use(function(){console.log(“2”)});
app.use(express.favicon());
app.use(express.logger(‘dev’));
app.use(express.json());
app.use(express.urlencoded());
app.use(express.methodOverride());
app.use(express.cookieParser());

app.use() 是按顺序来执行的,可是遇到我自己的写的函数就不往下执行了,是不是我自己的函数中没有next(), 而且其他的模块,比如 express.json() 中都有 next(), 新手,求讨论。


6 回复

Node.js app.use() 中的执行顺序

app.use() 方法用于注册中间件函数。这些中间件函数会按照它们被注册的顺序依次执行。如果你发现某些自定义的中间件函数没有继续执行下去,很可能是因为你忘记调用 next() 函数。

示例代码

假设我们有以下代码:

const express = require('express');
const app = express();

// 自定义中间件
app.use(function(req, res, next) {
    console.log("1");
    // 必须调用 next() 才能继续执行下一个中间件
    next();
});

app.use(function(req, res, next) {
    console.log("2");
    next();
});

// 使用 Express 的内置中间件
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(express.methodOverride());
app.use(express.cookieParser());

// 定义一个路由
app.get('/', function(req, res) {
    res.send('Hello World!');
});

// 启动服务器
app.listen(3000, function() {
    console.log('Server is running on port 3000');
});

解释

  1. 中间件顺序:中间件函数会按照它们被注册的顺序依次执行。
  2. 调用 next():每个中间件函数都必须调用 next() 来确保请求能够传递到下一个中间件或路由处理程序。如果你不调用 next(),请求将在此处停止,后续的中间件将不会被执行。

示例分析

在上面的示例中:

  • 第一个中间件 console.log("1"); 会打印 “1” 并调用 next()
  • 第二个中间件 console.log("2"); 会打印 “2” 并调用 next()
  • 接下来的中间件(如 express.favicon()express.logger() 等)都会按顺序执行,因为它们内部已经包含了 next() 的调用。

如果你在自定义中间件中忘记调用 next(),那么请求会在该中间件处停止,不会继续执行后续的中间件或路由处理程序。

总结

确保每个中间件函数都调用了 next(),这样可以保证请求能够顺利地传递到下一个中间件或路由处理程序。如果某个中间件函数没有调用 next(),那么请求就会卡在这个中间件上,导致后续的中间件无法执行。


use的话,应该是要用中间件了吧,这个是有约定的… 得按照这个约定写函数

function (req, res, next){

next() // 调用的话,继续向下传递… 不调用就终止 }

哦,原来是这样,3Q。还有个问题,app.use(app.router)和routes(app)之间是什么关系,前者是用来配置url的,那后者怎么个原理?

4.0已经取消app.use(app.router)

4.0中怎么用,能给个demo吗?谢了哈。

app.use() 中的中间件函数是按照它们被注册的顺序依次执行的。如果你定义的中间件函数中没有调用 next() 函数,那么后续的中间件函数将不会被执行。

以下是一个具体的示例代码,展示中间件的执行顺序:

const express = require('express');
const app = express();

// 自定义中间件函数
function myMiddleware1(req, res, next) {
    console.log("MiddleWare 1");
    // 如果不调用 next(),下面的中间件将不会执行
    next();
}

function myMiddleware2(req, res, next) {
    console.log("MiddleWare 2");
    next();
}

// 注册中间件
app.use(myMiddleware1);
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.json());
app.use(express.urlencoded());
app.use(express.methodOverride());
app.use(express.cookieParser());
app.use(myMiddleware2);

// 路由处理
app.get('/', (req, res) => {
    res.send('Hello World!');
});

app.listen(3000, () => console.log('Server is running on port 3000'));

在这个例子中:

  • myMiddleware1myMiddleware2 是自定义中间件。
  • 当一个请求到达时,首先会执行 myMiddleware1,如果它调用了 next(),则会继续执行其他中间件。
  • express 提供的中间件(如 express.favicon() 等)也遵循相同的规则。

因此,确保每个中间件函数都调用了 next() 是关键,这样才能让请求继续传递到下一个中间件。

回到顶部