'Sequelize null value in column violates not-null constraint

I'm getting this error when trying to associate a like to a post.

Unhandled rejection SequelizeDatabaseError: null value in column "userId" violates not-null constraint

Now the following code gets the post id and user id ok, i did a console log. What could i be doing wrong ?

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

})

here is the likes migration

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

Posts migration

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

Like model

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

extra

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


Solution 1:[1]

In your create call in resolver you are not giving it the necessary values, you have a where clause but not actually giving it the value for required userId.. looks like the only value in your model is the Boolean you are setting

Solution 2:[2]

I figured it out.

I just used body instead of params for the 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
        })
    })

})

change my like model to this, i was using sourceKey instead of foreign keys

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

So now i can like a post, and it will attach the postId along with the usersId on the likes table.

like this

enter image description here

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Greg Belyea
Solution 2