首页 > 解决方案 > 我在 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)
})```

标签: node.jsexpress

解决方案


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(); 
  }
})

推荐阅读