Как проверить поле на основе данных другой модели - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь проверить поле даты на основе информации, хранящейся в базе данных через другую модель.

Когда я тестирую API, проверка корректно работает, выдавая исключение, однако вставка происходитдо этого исключения .То есть это не мешает вставке в базу данных.Где я ошибся?

Это моя функция проверки:

module.exports = (sequelize, DataTypes) => {
  const Step = sequelize.define('Step', {
  ...
  resultDate: {
    type: DataTypes.DATE,
    validate: {
      isEven(value){
        sequelize.models.Call
          .findById(this.call_id)
          .then(call => {
            if(value >= call.endingDate) throw new Error('Error message here!');
          });
  ...

И вот результат:

Executing (default): SELECT [...] `Call`.`id` = '19c7e81e-5c23-4fd5-8623-0170deee6cd4');
Executing (default): INSERT INTO `Steps` [...];
Unhandled rejection Error message here!

Очевидно, что первоначальный SELECT должен выполнить проверкуоднако перед проверкой завершите работу и сгенерируйте исключение, API вставит в базу данных и уже вернет успех!

Как попросить модель дождаться всех проверок перед вставкой?

1 Ответ

0 голосов
/ 28 марта 2019

Изменяя пользовательский артик валидатора (второй аргумент - обратный вызов), вы можете изменить его на асинхронный обработчик.Итак, ваш код должен выглядеть так:

module.exports = (sequelize, DataTypes) => {
  const Step = sequelize.define('Step', {
  ...
  resultDate: {
    type: DataTypes.DATE,
    validate: {
      isEven(value, next){
        sequelize.models.Call
          .findById(this.call_id)
          .then(call => {
            next(value >= call.endingDate ? 'Error message here!' : null)
          })
          .catch(next);
  ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...