Javascript Node.js错误处理安装程序未按预期工作

Javascript Node.js错误处理安装程序未按预期工作,javascript,node.js,error-handling,Javascript,Node.js,Error Handling,我试图将所有错误消息放在一个文件中,每个错误都由一个错误代码表示,然后在我的函数/服务中,当出现错误时,我调用一个函数,该函数将错误代码作为参数,然后向客户端返回一个对象,其中包含错误代码和errors.js文件中的相应错误消息。 例如,一个用户试图注册数据库中已经存在的电子邮件,下面是我如何尝试注册的: //userService.js——我的注册函数在哪里 const{errorThrower}=require('../../utils/errorHandlers'); ... 静态异步寄

我试图将所有错误消息放在一个文件中,每个错误都由一个错误代码表示,然后在我的函数/服务中,当出现错误时,我调用一个函数,该函数将错误代码作为参数,然后向客户端返回一个对象,其中包含错误代码和errors.js文件中的相应错误消息。 例如,一个用户试图注册数据库中已经存在的电子邮件,下面是我如何尝试注册的:

//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.js
exports.register=async(req,res)=>等待registerNewUser(req.body)
,所以是的,这不是问题所在,还有其他想法吗?这正是问题所在(可能)。你在哪里调用
寄存器
函数?你到底看到了什么?记住,这只是一个控制器文件,这里导出的
寄存器
被导入userRoutes.js文件,所以express
router.post('/register',register)
将请求重定向到控制器,然后再重定向到userService.js!我希望您能遵循这一点,谢谢,但这不是一个非常理想的解决方案,我需要一个作为中间件的小助手功能,以便在整个应用程序中应用,这样我就不必尝试捕捉每一条路线,有什么想法吗?无论如何,谢谢)