Express 中间件和参数处理路由顺序
Express middleware and parameter handling ordering on route
所以我正在 运行 进行一些 API 测试,我注意到一个测试失败了,因为它在中间件之前 运行 进行了一些参数处理逻辑,现在这里是一个例子路线定义:
app.post("/something/:some_param",
middlewareA, middlewareB, middlewareC,
function(req, res) {
// Do stuff
});
现在我假设(我认为是错误的)中间件将首先被调用,然后它将处理 :some_param
的参数处理程序,但它似乎是相反的。 (参数处理程序我的意思是 app.param())
我这里的问题是,如果以上是正确的并且参数处理程序是 运行 首先,参数处理程序中的一些逻辑假定用户已经登录,如果没有登录,就会崩溃,并且 middlewareA
处理用户身份验证,如果他们没有登录则重定向他们等,所以理想情况下我希望先调用 middlewareA,那么有没有办法实现这种排序?
我能看到这个工作的唯一方法是参数处理程序可以利用中间件,但是没有关于这个主题的 API 文档的文档,所以有什么最佳实践来处理这种设想?因为我不想把我的 middlewareA
逻辑强加到我的 :some-param
处理逻辑中,因为我还有许多其他 :other-param
处理程序等,它们也需要这个身份验证(和其他)中间件运行 在他们 运行.
之前
是的,参数处理程序 运行 在中间件之前。您可以通过以下任一方式处理此问题:
- 将您的参数处理程序重新编码为中间件。这两种机制之间没有太大区别。
- 或者,在您的参数处理程序中,直接 运行 所需的中间件,如下所示:
.
function someParam(req, res, next, paramValue) {
myAuthMiddleware(req, res, function (error, result) {
if (error) {
next(error);
return;
}
//Here the user will be logged in
// do what you need to do with req and paramValue
next();
});
}
所以我正在 运行 进行一些 API 测试,我注意到一个测试失败了,因为它在中间件之前 运行 进行了一些参数处理逻辑,现在这里是一个例子路线定义:
app.post("/something/:some_param",
middlewareA, middlewareB, middlewareC,
function(req, res) {
// Do stuff
});
现在我假设(我认为是错误的)中间件将首先被调用,然后它将处理 :some_param
的参数处理程序,但它似乎是相反的。 (参数处理程序我的意思是 app.param())
我这里的问题是,如果以上是正确的并且参数处理程序是 运行 首先,参数处理程序中的一些逻辑假定用户已经登录,如果没有登录,就会崩溃,并且 middlewareA
处理用户身份验证,如果他们没有登录则重定向他们等,所以理想情况下我希望先调用 middlewareA,那么有没有办法实现这种排序?
我能看到这个工作的唯一方法是参数处理程序可以利用中间件,但是没有关于这个主题的 API 文档的文档,所以有什么最佳实践来处理这种设想?因为我不想把我的 middlewareA
逻辑强加到我的 :some-param
处理逻辑中,因为我还有许多其他 :other-param
处理程序等,它们也需要这个身份验证(和其他)中间件运行 在他们 运行.
是的,参数处理程序 运行 在中间件之前。您可以通过以下任一方式处理此问题:
- 将您的参数处理程序重新编码为中间件。这两种机制之间没有太大区别。
- 或者,在您的参数处理程序中,直接 运行 所需的中间件,如下所示:
.
function someParam(req, res, next, paramValue) {
myAuthMiddleware(req, res, function (error, result) {
if (error) {
next(error);
return;
}
//Here the user will be logged in
// do what you need to do with req and paramValue
next();
});
}