#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
таблицей «Нравится».
вот так