Node.js 第二个中间件仅在route方法之后调用
我有两个中间件,一个检查用户是否有有效的令牌,另一个检查用户是否有权限。问题是,在调用第一个中间件之后,程序将直接进入我的路由方法,而不是调用第二个中间件。这是我的代码:Node.js 第二个中间件仅在route方法之后调用,node.js,express,Node.js,Express,我有两个中间件,一个检查用户是否有有效的令牌,另一个检查用户是否有权限。问题是,在调用第一个中间件之后,程序将直接进入我的路由方法,而不是调用第二个中间件。这是我的代码: app.use(function(req, res, next) { checkToken(req, res, next); checkPermission(req, res, next); }); app.post("/test", (req, res) => { console.log("route")
app.use(function(req, res, next) {
checkToken(req, res, next);
checkPermission(req, res, next);
});
app.post("/test", (req, res) => {
console.log("route");
})
function checkToken(req, res, next){
console.log("check token");
if(validToken())
next();
else
res.send("no valid token");
}
function checkPermission(req, res, next){
console.log("check permission");
if(permission())
next();
else
res.send("no permission");
}
我得到的输出:
检查令牌->路由->检查权限
我期望的输出:
检查令牌->检查权限->路由
我想让我的程序做的是,在进入我的路由方法之前,检查用户是否拥有有效的令牌以及他是否拥有权限
这样做对吗 每个express中间件都有一个
next
回调来触发下一个中间件,但是在这里,您在中间件内部调用了两个函数,它们在每个方法中调用next
。你必须像这样重构你的代码
app.use(checkToken);
app.use(checkPermission);
app.post("/test", (req, res) => {
console.log("route");
});
...
app.use(checkToken); // <== first middleware
app.use(checkPermission) // <== Second middleware
app.post("/test", (req, res) => {
console.log("route");
})
function checkToken(req, res, next) {
console.log("check token");
if (validToken())
next();
else
res.send("no valid token");
}
function checkPermission(req, res, next) {
console.log("check permission");
if (permission())
next();
else
res.send("no permission");
}
app.use(checkToken);// 另请参见,以更好地了解中间件的工作方式
/* Check token */
function checkToken(req, res, next) {
console.log("check token");
if(validToken())
next();
else
res.send("no valid token");
}
/* Check permission */
function checkPermission(req, res, next) {
console.log("check permission");
if(permission())
next();
else
res.send("no permission");
}
/* Calling the middleware in right order */
app.use(checkToken, checkPermission, (req, res, next) => {
next();
});
/* Finally our route */
app.post("/test", (req, res) => {
console.log("route");
});