Обработка ошибок базы данных с помощью Sequelize, когда столбец не существует? - PullRequest
0 голосов
/ 24 января 2020

Я пытаюсь обработать различные ошибки, которые могут появляться при вставке в базу данных 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 ошибочное поведение.

Может ли кто-нибудь указать мне правильное направление на то, что я пропускаю?

1 Ответ

0 голосов
/ 24 января 2020

По моему опыту, было бы лучше избежать этой конкретной проблемы, проверяя поля на стороне клиента.

Но вы можете перехватить такое условие в js. Вы не получите исключение БД, потому что Sequelize не отправляет ваши нераспознанные атрибуты в базу данных.

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

Вы можете написать служебную функцию для перебора атрибутов req.body и отправить соответствующую ошибку в ответ.

FWIW, вы обнаружите, что Name также недопустимо, потому что ваша модель указывает (нижний регистр) name

hth

...