【问题标题】:Sequelize null value in column violates not-null constraintSequelize 列中的空值违反非空约束
【发布时间】:2022-05-08 07:03:35
【问题描述】:

我在尝试将点赞与帖子相关联时收到此错误。

未处理的拒绝 SequelizeDatabaseError:列中的空值 “userId”违反了非空约束

现在下面的代码获取了帖子 ID 和用户 ID 好的,我做了一个 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
        })
    })

})

这里是喜欢迁移

  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'
   )
  }
};

【问题讨论】:

    标签: node.js postgresql sequelize.js


    【解决方案1】:

    在解析器中的 create 调用中,您没有给它必要的值,您有一个 where 子句,但实际上没有给它所需的 userId 的值。看起来您的模型中唯一的值是您正在设置的布尔值

    【讨论】:

    • 对不起,格雷格,我真的不明白,你的意思。因为这个router.post('/:userId/like/:postId') 获取了用户 ID 和帖子 ID,我可以看到它在检索数据时工作正常
    • 我应该怎么做呢?我将如何重写它以使其正常工作,所以它会在帖子中附加一个赞?
    • 您的like 表是否有名为userID 和likeID 的列?您将它们放在您的关联中,但不在模型列列表中。您在 Likes 模型中设置的唯一值是:true,无论您在 where 子句中做什么,都不会在模型中设置这些值,错误说该列 userId 是强制性的,因此您需要设置它,我想我不确定为什么这些列未在您的模型中列出..
    • 我不明白你为什么在你的 create 调用中有一个 where 子句用于 like
    • 因为他们在迁移中定义:(这太令人困惑了,让我看看我能做什么。我会提供更多信息。
    【解决方案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;
    }
    

    所以现在我可以点赞一个帖子,它会在点赞表上附上postIdusersId

    喜欢这个

    【讨论】:

      猜你喜欢
      • 2021-08-06
      • 2021-11-02
      • 1970-01-01
      • 1970-01-01
      • 2016-02-14
      • 2017-02-18
      • 2020-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多