“SequelizeValidationError: notNull Violation” в свойстве, которое не было бы должно существовать

Я пишу унитарные доказательства для сервера узла, который использует Sequelize. Введя какие-то фальшивые данные я получаю ошибку

SequelizeValidationError: notNull Violation: QuestionId cannot be null

Замечать прописную Q в QuestionId

доказательство:

describe('answerQuestion', () => {
    it('debe insertar una respuesta y conseguir la siguiente pregunta', (done) => {
        Survey.DBModel.create({lookType: 0}, {logging: false}).then(() => {
            Question.DBModel.create({type: 0, text: 'Test question'}, {logging: false}).then(q1 => {
                Question.DBModel.create({type: 1, text: 'Next question'}, {logging: false}).then(q2 => {
                    console.log('antes');
                    QuestionOption.DBModel.create({text: 'Test option', questionId: 1, nextQuestionId: 2}, {logging: false}).then(() => {
                        console.log('despues');
                        Survey.answerQuestion(1, 1, 1).then(question => {
                            question.should.have.property('id');
                        }, done);
                    }, done);
                }, done);
            }, done);
        }, done);
    });
});

Выводы консоли "раньше", но ошибки до того, как он прибывает "после"

question.js

'use strict';
module.exports = function(sequelize, DataTypes) {
  var Question = sequelize.define('Question', {
    id: {
      allowNull: false,
      autoIncrement: true,
      primaryKey: true,
      type: DataTypes.INTEGER
    },
    type: {
      allowNull: false,
      type: DataTypes.INTEGER
    },
    text: {
      allowNull: false,
      type: DataTypes.STRING
    },
    nextQuestionId: {
      type: DataTypes.INTEGER
    }
  }, {
    classMethods: {
      associate: function(models) {
        models.Question.belongsTo(models.Question, {as: 'nextQuestion', foreignKey: {field: 'nextQuestionId', allowNull: true}});
        models.Question.hasMany(models.Answer, {as: 'answers', foreignKey: {field: 'questionId', allowNull: false}});
        models.Question.hasMany(models.QuestionOption, {as: 'options', foreignKey: {field: 'questionId', allowNull: false}});
        models.Question.hasMany(models.QuestionOption, {as: 'referrers', foreignKey: {field: 'nextQuestionId', allowNull: true}});
      }
    }
  });
  return Question;
};

questionoption.js

'use strict';
module.exports = function(sequelize, DataTypes) {
  var QuestionOption = sequelize.define('QuestionOption', {
    id: {
      allowNull: false,
      autoIncrement: true,
      primaryKey: true,
      type: DataTypes.INTEGER
    },
    questionId: {
      allowNull: false,
      type: DataTypes.INTEGER
    },
    text: {
      allowNull: false,
      type: DataTypes.STRING
    },
    nextQuestionId: {
      type: DataTypes.INTEGER
    }
  }, {
    classMethods: {
      associate: function(models) {
        models.QuestionOption.belongsTo(models.Question, {as: 'question', foreignKey: {field: 'questionId', allowNull: false}});
        models.QuestionOption.belongsTo(models.Question, {as: 'nextQuestion', foreignKey: {field: 'nextQuestionId', allowNull: true}});
      }
    }
  });
  return QuestionOption;
};

Эти модели достаточно сильно соединены между собой и у них есть autorreferencial и все виды случаев. Все остальные модели, которых я чувствую, не являются значимыми для этого, но возможно предоставлять, если он необходим.

Выполнять SQL в базе данных SQLite прямо, в том же порядке и с теми же свойствами, что и решения СОЧТИТЕ предыдущим не исключение, уже кривизна многих доказательств.

Очевидно, что Sequelize не пробует выполнить решение о создании QuestionOption. Ошибки перед тем, как производить SQL, чтобы выполнять.

Какое-то странное поведение состоит в том, что ассоциации определены педантично в моделях и у всех них есть меньший случай q для questionId в Ваших определениях. Во всех ассоциациях есть также обратная определенная ассоциация, из-за Sequelize он не был бы должен стараться создавать имена свойств.

Все подмостки исчезают и вновь создают перед каждым доказательством (успешно).

Добавляя в свидетельство того, что что-то редкое происходит, дело в том, что, если я ухожу questionId: 1 решения о создании QuestionOption, он превращается тогда в ошибку

SequelizeValidationError: notNull Violation: questionId cannot be null, 
notNull Violation: QuestionId cannot be null

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

Следующий подозреваемый - ассоциация nextQuestionId, но он определился в модели, и каждой стороне ассоциации какallowNull: true и я предоставлял в решении о создании.

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

Другая информация, которая возможно могла бы быть полезной:

  • Доказательства работают посредством команды NODE_ENV = test mocha
  • Создание базы данных для доказательств автоматическое используя sync (код внизу)
  • Все другие доказательства происходят, но это уникум, который использует QuestionOption в доказательстве.
  • Метод, который я стараюсь тестировать, функционирует "в производстве" (что работает локально в dev с соединенным клиентом)
  • Схема базы данных была проверена SQLite GUI и все колонны приспособлены (нет field QuestionId в любом table с Q заглавной буквы)

Создание баз данных для доказательств

beforeEach((done) => {
    Survey.DBModel.sync({force: true, logging: false}).then(() => {
        Question.DBModel.sync({force: true, logging: false}).then(() => {
            Answer.DBModel.sync({force: true, logging: false}).then(() => {
                QuestionOption.DBModel.sync({force: true, logging: false}).then(() => {
                    done();
                }, done);
            }, done);
        }, done);
    }, done);
});
7
задан 23.02.2017, 19:54
1 ответ

Мне не нравится отвечать вопросы, которых я не доминирую, (и я не понимаю, как объяснять), но как я вижу, что этот вопрос формулировался, он делает какое-то время я попробую делать его каковым смоги быть ошибкой и Вашим решением.

Попытался менять эту линию:

QuestionOption.DBModel.create({text: 'Test option', questionId: 1,
                              nextQuestionId: 2}, {logging: false}).then(() => {

поэтому:

QuestionOption.DBModel.create({text: 'Test option', questionId: 1, 
                              QuestionId: 1 ,
                              nextQuestionId: 2}, {logging: false}).then(() => {

ты Можешь видеть, что есться aГ±adido QuestionId: 1,

Однажды кто-то решил равную ошибку в отличном коде, определяя аргумент внутри нее funciГіn, что возвращал, так что я думаю, что, может быть, предыдущее помогает ему.

2
ответ дан 01.12.2019, 08:17