Javascript Node.js错误处理安装程序未按预期工作
我试图将所有错误消息放在一个文件中,每个错误都由一个错误代码表示,然后在我的函数/服务中,当出现错误时,我调用一个函数,该函数将错误代码作为参数,然后向客户端返回一个对象,其中包含错误代码和errors.js文件中的相应错误消息。 例如,一个用户试图注册数据库中已经存在的电子邮件,下面是我如何尝试注册的:Javascript Node.js错误处理安装程序未按预期工作,javascript,node.js,error-handling,Javascript,Node.js,Error Handling,我试图将所有错误消息放在一个文件中,每个错误都由一个错误代码表示,然后在我的函数/服务中,当出现错误时,我调用一个函数,该函数将错误代码作为参数,然后向客户端返回一个对象,其中包含错误代码和errors.js文件中的相应错误消息。 例如,一个用户试图注册数据库中已经存在的电子邮件,下面是我如何尝试注册的: //userService.js——我的注册函数在哪里 const{errorThrower}=require('../../utils/errorHandlers'); ... 静态异步寄
//userService.js——我的注册函数在哪里
const{errorThrower}=require('../../utils/errorHandlers');
...
静态异步寄存器Wuser(主体){
const exists=wait User.where({email:body.email}).fetch();
如果(存在){
错误投射器('400_2');
}
...
}
您没有捕捉到您在错误抛出器中抛出的错误,因此导致错误未处理PromiserEjectionWarning
。您需要做的是捕获错误并将其传递给下一个中间件,以便errorHandler
-中间件能够实际处理错误。大概是这样的:
exports.register = async(req, res) => {
try {
await registerNewUser(req.body);
} catch(err) {
next(err);
}
};
如果您不想对每个中间件都这样做,您可以创建一个“基础”中间件来处理这个问题:
const middlewareExecutor = async (req, res, next, fn) => {
try {
return await fn.call(fn, req, res, next);
} catch (err) {
next(err);
}
};
现在,您可以将中间件作为参数传递,并将错误处理委托给执行者:
app.use('/user' , async (req, res, next) => middlewareExecutor(req, res, next, user));
你不是在等待调用registerNewUser(body)
…不,我实际上在调用它时使用了wait,这是从userController.jsexports.register=async(req,res)=>等待registerNewUser(req.body)
,所以是的,这不是问题所在,还有其他想法吗?这正是问题所在(可能)。你在哪里调用寄存器
函数?你到底看到了什么?记住,这只是一个控制器文件,这里导出的寄存器
被导入userRoutes.js文件,所以expressrouter.post('/register',register)
将请求重定向到控制器,然后再重定向到userService.js!我希望您能遵循这一点,谢谢,但这不是一个非常理想的解决方案,我需要一个作为中间件的小助手功能,以便在整个应用程序中应用,这样我就不必尝试捕捉每一条路线,有什么想法吗?无论如何,谢谢)