我有2个中间件,一个中间件检查用户是否具有有效的令牌,第二个中间件检查用户是否具有权限。问题在于,在调用第一个中间件之后,程序将直接进入我的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");
}
我得到的输出:
检查令牌->路线->检查权限
我期望的输出:
检查令牌->检查权限->路线
我希望我的程序要做的是在进入我的route方法之前检查用户是否具有有效的令牌以及他是否具有权限!
这是正确的方法吗?
答案 0 :(得分:2)
app.use(checkToken);
app.use(checkPermission);
app.post("/test", (req, res) => {
console.log("route");
});
...
答案 1 :(得分:1)
每个快速中间件都有一个next
回调函数来触发下一个中间件,但是在这里,您正在中间件内部调用两个函数,每个函数都调用next
。您必须像这样重构代码,
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");
}
答案 2 :(得分:1)
另请参阅Writing middleware for use in Express apps,以更好地了解中间件的工作方式。
/* 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");
});