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()
, 新手,求讨论。
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');
});
解释
- 中间件顺序:中间件函数会按照它们被注册的顺序依次执行。
- 调用
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'));
在这个例子中:
myMiddleware1
和myMiddleware2
是自定义中间件。- 当一个请求到达时,首先会执行
myMiddleware1
,如果它调用了next()
,则会继续执行其他中间件。 express
提供的中间件(如express.favicon()
等)也遵循相同的规则。
因此,确保每个中间件函数都调用了 next()
是关键,这样才能让请求继续传递到下一个中间件。