node.js - 如何按照存储库模式从 nodeJS 应用程序中的服务和存储库中抛出错误

标签 node.js express error-handling repository-pattern

我正在用 NodeJS、expressJS 开发一个 API,我正在遵循存储库模式。所以有 Controller 、服务和存储库。 现在,按照存储库模式的规则,我的 Controller 、服务和存储库是这样的。这些只是为了演示目的,实际代码与此不同。

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 });
    }

}

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;
    }
}

userRepository.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 } }
    }
}

现在我面临的问题是我重复代码并从 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!')
})

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

最佳答案

在 Controller 中,将服务调用包围在 try-catch block 中并将错误传递给下一个函数。

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

关于node.js - 如何按照存储库模式从 nodeJS 应用程序中的服务和存储库中抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63239881/

相关文章:

node.js - 如何解决 npm MS 构建问题

javascript - 在 Model.beforeValidate 中获取数组值

node.js - 如何在 Node Express 中将表数据存储在缓存中?

javascript - typeerror : app. use() 需要中间件函数

java - 移除 fragment 崩溃

node.js - 具有自定义属性的文件对象

javascript - Node 调度-tz : Issue with timezone

node.js - 在子目录中找不到 Jade 布局

.net - .NET Web服务中的错误处理策略

laravel - 缺少[Route : roles.destroy]的必填参数