如何按照存储库模式从 NodeJS 应用程序中的服务和存储库抛出错误

kin*_*der 5 error-handling repository-pattern node.js express

我正在 NodeJS、expressJS 中开发 API,并且遵循存储库模式。所以有控制器、服务和存储库。现在,根据存储库模式的规则,我的控制器、服务和存储库如下所示。这些仅用于演示目的,实际代码与此不同。

authController.js

export const loginController = async (req, res, next) => {
    const user = await authServices.login(req.body);
    if (user.error) {
        res.error(user.errorBody)
    }
    else {
        return res.success({ code: 200, message: "Logged in succesfully", data: user });
    }

}
Run Code Online (Sandbox Code Playgroud)

authServices.js

export const loginServcies = async (loginDetails) => {
    const user = await userRepository.login(loginDetails);
    if (!user) {
        return {
            error: true, errorBody: {
                code: 422, message: 'User doesnot exist', errors: null
            }
        }
    }
    else if (!user.active) {
        return { error: true, errorBody: { code: 403, message: 'User not active', errors: null } };
    }
    else if (user) {
        return user;
    }
}
Run Code Online (Sandbox Code Playgroud)

用户存储库.js

export const userRepository = async (loginDetails) => {
    let user;
    try {
        user = await user.find({ where: { user: loginDetails.user } })
    }
    catch (error) {
        return { error: true, errorBody: { code: 500 } }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我面临的问题是我正在重复代码并从 repo => services => controller 返回错误。我想要的是,从任何地方抛出错误,无论是存储库还是服务。根据express文档,我们可以在app.js中使用全局中间件并将错误传递给下一个函数next(err),例如,express将自动处理该问题。

app.use(function (err, req, res, next) {
  console.error(err.stack)
  res.status(500).send('Something broke!')
})
Run Code Online (Sandbox Code Playgroud)

但由于我们的服务和存储库中不提供 next() 函数,我该如何处理和抛出错误?在上面的示例中,我只是将两个错误从服务传递到控制器,但在实际情况下,可能会有很多错误,所以我将重复很多我不想做的代码

小智 0

在控制器中,将服务调用放在 try-catch 块中并将错误传递给下一个函数。

然后,您可以在服务和存储库函数中抛出错误,并在 errorHandler 中间件中管理它们。