Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Express.js自定义错误处理中间件isn';有几个错误我不工作_Node.js_Typescript_Express - Fatal编程技术网

Node.js Express.js自定义错误处理中间件isn';有几个错误我不工作

Node.js Express.js自定义错误处理中间件isn';有几个错误我不工作,node.js,typescript,express,Node.js,Typescript,Express,自定义错误处理程序: export const errorHandler: ErrorRequestHandler = (err, _, res) => { if (err instanceof HttpError) { res.status(err.statusCode).json({ message: err.message }); return; } res.status(500).json({ message: err.mes

自定义错误处理程序:

export const errorHandler: ErrorRequestHandler = (err, _, res) => {
  if (err instanceof HttpError) {
    res.status(err.statusCode).json({
      message: err.message
    });
    return;
  }
  res.status(500).json({
    message: err.message,
  });
};
我在其中抛出错误的处理程序:

export const registerHandler: Handler = async (req, res) => {
  const { username, password } = req.body as {
    username: string | undefined;
    password: string | undefined;
  };

  if (!username || !password) {
    throw new UnprocessableEntity();
  }

  try {
    const user = await User.register(username, password);
    req.logIn(user, (err) => {
      console.log(err);
    });

    res.json({
      user,
    });
  } catch (error) {
    throw new BadRequest(error.message);
  }
};

错误处理程序中间件在任何地方都能正常工作,但在registerHandler的catch块中抛出时除外。这快把我逼疯了。有人能解释为什么会这样吗?

中间件是管道,换句话说,函数在另一个函数之后运行,因此如果要运行错误处理程序,需要传递下一个要运行的函数


export const registerHandler:Handler=async(req、res、next)=>{
const{username,password}=req.body as{
用户名:字符串|未定义;
密码:字符串|未定义;
};
如果(!用户名| |!密码){
//要让express知道下一个要运行的函数是errorhandler,您需要向下一个函数传递一个参数
返回下一个(新的不可处理实体());
}
试一试{
const user=wait user.register(用户名、密码);
请求登录(用户,(错误)=>{
控制台日志(err);
});
res.json({
用户,
});
}捕获(错误){
抛出新的BadRequest(错误消息);
}
};
要创建错误处理程序,您需要创建一个带有4个参数的函数 错误:错误 请求:请求 res:答复 下一个:下一个处理程序

函数errorHandler(错误、请求、恢复、下一步){
if(err instanceof HttpError){
返回res.status(err.statusCode).json({
消息:err.message
});
}
返回下一个(错误);
}
要使其工作,您需要在所有路由之后指定错误处理程序


const app=express()
app.use(“/api”,apirouts());
app.use(“/more routes”,more routes());
应用程序使用(errorHandler);
应用程序使用(anotherErrorHandler);
这可能不是您想要的确切解决方案,但可能会有所帮助

说:-

  • 从Express 5开始,返回承诺的路由处理程序和中间件将在拒绝或抛出错误时自动调用next(值)
所以你根本不需要尝试和抓住

上述代码可以写成:-

export const registerHandler:Handler=async(req,res)=>{
const{username,password}=req.body as{
用户名:字符串|未定义;
密码:字符串|未定义;
};
如果(!用户名| |!密码){
抛出新的不可处理实体();
}
const user=wait user.register(用户名、密码);
请求登录(用户,(错误)=>{
控制台日志(err);
});
res.json({
用户,
});
};

如果在等待行中发生任何错误,将自动调用errorHandler,您不必显式抛出错误。

我在所有路由和其他中间件之后应用了errorHandler中间件。