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中间件。