在sequelize ORM查询语句中处理错误的位置?

Jos*_*ale 28 javascript express sequelize.js

我在Node/Express中使用Sequelize ORM.

我有两个表,User和Item.Item具有链接到UserId的外键.

当我尝试创建一个UserId无效的项目(在Users表中不存在)时,会抛出"SequelizeForeignKeyConstraintError"并导致由于未处理而导致应用程序崩溃.

我遇到的问题是:

我在哪里处理错误?

这是我的代码.

.post(function(req,res){
        models.Item.create({
            title : req.body.title,
            UserId : req.body.UserId
        }).then(function(item){
            res.json({
                "Message" : "Created item.",
                "Item" : item
            });
        });
    });
Run Code Online (Sandbox Code Playgroud)

Jan*_*ier 33

如果要处理特定错误,请附加.catch处理程序

models.Item.create({
  title : req.body.title,
  UserId : req.body.UserId
}).then(function(item){
  res.json({
    "Message" : "Created item.",
    "Item" : item
  });
}).catch(function (err) {
  // handle error;
});
Run Code Online (Sandbox Code Playgroud)

如果你想更广泛地处理错误(比如,显示一个友好的错误消息,而不是杀死你的服务器,你可能想看看unhandledexception

https://nodejs.org/api/process.html#process_event_uncaughtexception

如果您使用快递,它还包含一些错误处理设施http://expressjs.com/en/guide/error-handling.html

  • 如果你想捕获特定的SequelizeForeignKeyConstraintError错误,可以将它传递给catch函数`.catch(Sequelize.SequelizeForeignKeyConstraintError,function(err){//处理onky外键错误;}); (17认同)
  • 是否可以通过Express中的HTTP 500状态和默认错误处理程序来处理所有ORM错误?实际上,每当我访问数据库时,我都不想添加`.catch(err => {next(err)});`。 (3认同)

小智 5

您可以通过执行以下操作来处理所有 ORM 错误以返回 HTTP 500 状态和一些默认错误消息

router.use((error, request, response, next) => {
  response.status(error.status || 500).json({
    status: 'error',
    error: {
      message: error.message || serverErrorMsg,
    },
  });
});

Run Code Online (Sandbox Code Playgroud)

上面的代码还允许您使用将发送到客户端的自定义消息抛出错误