node.js - 我在 express next(argument) 中传递一个参数,以便 express 中间件函数会捕获它,但为什么它也会通过 app.all("*")))
问题描述
app.use(Router)
//在这里的路由处理程序中,我传递了下一个(错误),为什么app.all中间件正在运行,控件不应该直接进入快速错误处理中间件跳过app.all//
app.all("*",(req,res,next)=>{
console.log("app middleware ran")
next(err)
})
app.use((err,req,res,next)=>{
res.status(400).send(err)
})```
解决方案
TL;博士;
使用throw err
而不是将其传递给next
. 使用 throw 会将请求重定向到通用快速错误处理中间件。
app.all("*",(req,res,next)=>{
console.log("app middleware ran")
throw new Error('my error')
})
多一点点
next
回调不用于将错误/数据传递给其他中间件/路由。用于在中间件成功完成它的事情的next
情况下继续流程。
一个通用的例子是好的旧auth
中间件(通常使用 JWT)
// pseudocode
// auth middelwhere
app.use((req,res,next)=>{
const jwt = JWT.decode(req.headers['Authorization'])
if(jwt) {
req.data.user = jwt; // append additional data to req context next middleware/routr
next(); // user is authenticated go to next middleware/routr
}
else {
// (1) use throw to pass error to "generic error handler"
throw new Error('unable_to_authenticate');
// (2) or handle error in the middleware
res.status(401);
res.end(); // Note: Don't call next() when resolving the request in the middleware
}
})
// generic error handler
app.use((err,req,res,next) => {
if(err.message === "unable_to_authenticate"){
res.status(401);
res.end();
}
else if(...) { ... }
else {
res.status(500);
res.end();
}
})
推荐阅读
- php - Laravel 应用程序的配置何时初始化?或者当 DB::connection 设置时?
- linux - 预期值:CLOSED,实际值:“CLOSED”
- r - 传递向量变量时 sum 函数不起作用
- vtt - 如何添加一种以上的字幕语言?
- javascript - VueJS;在运行本地 JavaScript 文件之前等待元素
- facebook - 如何获取 Facebook 好友数和帖子数?
- python - 如何使用 bash 和 Docker 观看 csv 文件的内容
- python - 如何使用 re.split 在 python 中拆分两列从 CSV 中查找字符串值
- linux - 不使用 sudo 重启 nginx 服务
- typescript - 打字稿角度中的参数化导入