Продолжение нулевого значения в столбце нарушает ненулевое ограничение

#node.js #postgresql #sequelize.js

#node.js #postgresql #sequelize.js

Вопрос:

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

Необработанное отклонение SequelizeDatabaseError: нулевое значение в столбце «Идентификатор пользователя» нарушает ограничение not-null

Теперь следующий код получает идентификатор записи и идентификатор пользователя. console log Что я могу делать неправильно?

routes/posts.js

 router.post('/:userId/like/:postId', (req, res)=> {
    models.Post.findOne({
      where:{
          id: req.params.postId
      }
    })
    .then( (like) => {
        if(like){
            models.Likes.create({
                where:{
                    userId: req.params.userId,
                    postId: req.params.postId
                },
                like:true

            }).then( (result) => {
                res.status(200).send({
                    message: 'You have like this post',
                    like: result
                })
            })
        }
    }).catch( (err) => {
        res.status(401).send({
            message: "Something went wrong",
            err: err
        })
    })

})
  

вот миграция likes

   up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('Likes', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      like: {
        type: Sequelize.BOOLEAN
      },
      userId: {
        allowNull: false,
        type: Sequelize.INTEGER,
        references: {
          model: 'Users',
          key: 'id'
        }
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Likes');
  }
};
  

Миграция сообщений

 'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('Posts', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      title: {
        type: Sequelize.STRING
      },
      post_content: {
        type: Sequelize.STRING
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      userId: {
        type: Sequelize.INTEGER,
        references: {
          model: 'Users',
          key: 'id'
        }
      },
      username: {
        type: Sequelize.STRING
      },
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Posts');
  }
};
  

Подобная модель

 'use strict';
module.exports = function(sequelize, DataTypes) {
  const Like = sequelize.define('Likes', {
    like:{
      type:DataTypes.BOOLEAN,
      allowNull:true
    }
  }, {});
    Like.associate = function(models) {
        Like.belongsTo(models.User, {
          onDelete: "CASCADE",
          sourceKey: 'userId'

        })
        Like.belongsTo(models.Post, {
          onDelete: "CASCADE",
          sourceKey: 'likeId'

        })
    }
  return Like;
}
  

Post.model

 module.exports = (sequelize, DataTypes) => {
  const Post = sequelize.define('Post', {
    title: DataTypes.STRING,
    post_content: DataTypes.STRING,
    username:  DataTypes.STRING
  }, {});
  Post.associate = function(models) {
    Post.belongsTo(models.User, {  foreignKey: 'userId',  targetKey: 'id' });
    Post.hasMany(models.Likes, {  foreignKey: 'postId',  sourceKey: 'id' });
  };
  return Post;
};
  

дополнительные

add_postId_to_likes

 'use strict';
module.exports = {
  up: function (queryInterface, Sequelize) {
     return queryInterface.addColumn(
      'Likes',
      'postId',
      {
        type: Sequelize.INTEGER,
        allowNull: true,
        references: {
          model: 'Posts',
          key: 'id',

        }
      }
    )
  },

  down: function (queryInterface, Sequelize) {
     return queryInterface.removeColumn(
     'Likes',
     'postId'
   )
  }
};
  

Ответ №1:

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

Комментарии:

1. Прости, Грег, я действительно не понимаю, что ты имеешь в виду. поскольку это router.post('/:userId/like/:postId') возвращает идентификатор пользователя и идентификатор записи, я вижу, что он отлично работает при извлечении данных

2. что мне делать вместо этого? как бы мне переписать это, чтобы заставить его работать, чтобы он прикреплял лайк к сообщению?

3. Есть ли в вашей таблице like столбцы с именами userId и likeID? Они есть в вашей ассоциации, но не в списке столбцов модели.. Единственное значение, которое вы устанавливаете в своей модели Likes, похоже на: true, что бы вы ни делали в этом предложении where, не устанавливает эти значения в модели, ошибка говорит, что идентификатор пользователя столбца является обязательным, поэтому вам нужно его установить, я думаю, я не уверен, почему эти столбцы не перечислены вваша модель..

4. Я не понимаю, почему у вас есть предложение where в вашем вызове create для подобного

5. поскольку они определены в миграциях: ( это так запутанно, позвольте мне посмотреть, что я могу сделать. я предоставлю больше информации.

Ответ №2:

Я понял это.

Я просто использовал body вместо params для postId .

 router.post('/like', (req, res)=> {

    models.Likes.create({
        postId: req.body.postId,
        userId:  req.user.id,
        like:true
    }).then( (result) => {
        res.status(200).send({
            message: 'You have like this post',
            like: result
        });
    }).catch( (err) => {
        res.status(401).send({
            message: "Something went wrong",
            err: err
        })
    })

})
  

измените мою подобную модель на эту, я использовал sourceKey вместо внешних ключей

 module.exports = function(sequelize, DataTypes) {
  const Like = sequelize.define('Likes', {
    like:{
      type:DataTypes.BOOLEAN,
      allowNull:true
    },
    // userId: {
    //   type: sequelize.INTEGER,
    //   references: {
    //     model: 'Users',
    //     key: 'id'
    //   }
    // },
  }, {});
    Like.associate = function(models) {
        Like.belongsTo(models.User, {
          onDelete: "CASCADE",
          foreignKey: 'userId'

        })
        Like.belongsTo(models.Post, {
          onDelete: "CASCADE",
          foreignKey: 'likeId'

        })
    }
  return Like;
}
  

Итак, теперь я могу поставить лайк сообщению, и оно будет прикреплено postId вместе с usersId таблицей «Нравится».

вот так

введите описание изображения здесь