【问题标题】:Database error handling with Sequelize when column doesn't exist?当列不存在时使用 Sequelize 处理数据库错误?
【发布时间】:2020-01-25 01:20:45
【问题描述】:

我正在尝试处理插入 MYSQL 数据库时可能出现的不同错误。

将 Sequelize 与 express 一起使用。

我的 foo.js 模型文件如下所示:

module.exports = (sequelize, type) => {
  return sequelize.define('event', {
    id: {
      type: type.INTEGER,
      primaryKey: true,
      autoIncrement: true
    },
    name: {
      type: type.STRING,
      }
  },{
    freezeTableName: true,
    rejectOnEmpty: true,
  })
}

我的路线文件(或任何你想叫的名字)看起来像这样。

const Sequelize = require('sequelize')
const fooModel = require('../../models/Foo')
const router = require('express').Router();
const auth = require('../auth');
const bodyParser = require('body-parser');
const sequelize = new Sequelize('username', 'password', 'db', {
      host: 'localhost',
      dialect: 'mysql'
})

const Foo = fooModel(sequelize, Sequelize);
router.use(bodyParser.json({limit: '100mb'}));
router.use(bodyParser.urlencoded({ extended: true, limit: '100mb', parameterLimit: 1000000 }));


sequelize.sync({force: true})
.then(() => {
      console.log('Worked');
});

router.post('/', (req,res,next) => {
      if(Object.keys(req.body).length > 0){ 
            return Foo.create({
                  Name: req.body.Name
            }).then((result) => {
                  if(result){
                        return res.status(200).json(result);
                  }else{
                        return res.status(400).json({'error': 'Could not create record.'});
                  }
            }).catch(Sequelize.DatabaseError, function(err){
                return res.status(400).json(err);
            }).catch(function(err){
                res.send(err);
            })
      }else{
            return res.status(400).json({'error': 'error'});
      }
});

module.exports = router;

每当我尝试使用以下内容发布到路线时:

{
  "name": "test",
  "foo": "bar"
}

Sequelize 接受正文并将“test”放在“name”列中,并忽略“foo”列,因为“foo”列不存在。意思是,一旦发布,我得到的只是:

{"id": "123",
createdAt: 2020-01-23 13:337:00
updatedAt: 2020-01-23 13:337:00
}

而且不是我预期的错误。

我想要做的是,每当我尝试发布到一个不存在的列时捕获那个错误(我今天没有收到),基本上复制了一个正常的 MYSQL 错误行为。

有人能指出我所缺少的正确方向吗?

【问题讨论】:

    标签: express sequelize.js


    【解决方案1】:

    根据我的经验,最好通过验证客户端的字段来避免这个特殊问题。

    但是,你可以在 js 中捕获这样的条件。您不会得到数据库异常,因为 Sequelize 不会将您无法识别的属性发送到数据库。

    if (!Foo.attributes.hasOwnProperty('foo')) { 
       // some error handing here, for invalid field.
    }
    

    您可以编写一个实用函数来遍历req.body 的属性,并向响应发送适当的错误。

    FWIW,你会发现Name 也是无效的,因为你的模型指定(小写)name

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-24
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      相关资源
      最近更新 更多