无法从后端 sequelize 上的用户删除 post
Unable to delete post from a user on backend sequelize
我正在尝试学习 sequelize v6。我已经创建了一个包含 3 tables(用户、posts 和评估)的数据库。在我的控制器文件夹中,我有三个文件(UserController.js、PostController.js 和 EvaluationController.js),我在其中设置默认控件,例如创建用户、创建 post 和创建评估,什么工作正常,但现在我试图在我的 PostController 中创建一个删除功能,但我不知道为什么它不工作。
这是我的 UserConroller 文件:
const User = require('../models/User');
const Post = require('../models/Post');
module.exports = {
async index (req, res) {
const { user_id } = req.params;
const user = await User.findByPk(user_id, {
include: { association: 'posts' }
});
return res.json(user.posts);
},
async store(req, res) {
const { user_id } = req.params;
const { description, image_url, latitude, longitude } = req.body;
const user = await User.findByPk(user_id);
if (!user) {
return res.status(400).json({ error: 'User not found' });
}
const post = await Post.create({ description, image_url, latitude, longitude, user_id });
return res.json(post);
},
async delete(req, res) {
const { user_id } = req.params;
const { name } = req.body;
const user = await User.findByPk(user_id);
if (!user) {
return res.status(400).json({ error: "User not found" });
}
const post = await Post.findOne({
where: { name }
});
await user.removeUser(post);
return res.json();
},
async delete(req, res) {
const { user_id } = req.params;
const { image_url } = req.body;
const user = await Post.findByPk(user_id);
if (!user) {
return res.status(400).json({ error: 'Post not found' });
}
const post = await Post.findOne({
where: { image_url }
});
await user.removePost(post);
return res.json();
}
};
在 routes.js 文件中,我有 post 的这些路由:
routes.get('/users/:user_id/post', PostController.index);
routes.post('/users/:user_id/post', PostController.store);
routes.delete('/users/:user_id/post', PostController.delete);
在我的模型文件夹中我有 Post.js 那是我使用 sequelize 来控制我的后端的地方:
const { Model, DataTypes } = require('sequelize');
class Post extends Model {
static init(sequelize) {
super.init({
description: DataTypes.STRING,
image_url: DataTypes.STRING,
latitude: DataTypes.STRING,
longitude: DataTypes.STRING,
}, {
sequelize
})
}
static associate(models) {
this.belongsTo(models.User, { foreignKey: 'user_id', as: 'owner' });
this.hasMany(models.Evaluation, { foreignKey: 'post_id', as: 'evaluations' });
}
}
module.exports = Post;
我已经在我的用户 table 中创建了 3 个用户,列如下:id、user_id 描述、image_url 纬度、经度、created_at、updated_at
当我尝试删除我用 id 1 创建的 post 时,user_id: 3,描述:任何描述,因为我想删除,image_url: https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2Ftse1.mm.bing.net%2Fth%3Fid%3DOIP.E4gCagrjAkQ5td5qjSc3rwHaE7%26pid%3DApi&f=1,纬度:-10.962526333931583,经度:-37.103513513954375,created_at:2021-08-13 23:56:58,和updated_at:2021-08-13 23:56:58,因为我已请求将 image_url 作为参数发送 我在数据库列中发送了相同的 image_url,但我的 post 没有被删除,我没有看到错误消息,而是JSON { "error": "Post not found" }
并在控制台中显示:
Executing (default): SELECT `id`, `description`, `image_url`, `latitude`, `longitude`, `created_at` AS `createdAt`, `updated_at` AS `updatedAt`, `user_id` FROM `posts` AS `Post` WHERE `Post`.`id` = '3';
删除我的 post 我错过了什么?
您导出函数的方式不对,您有两个删除函数。
像这样导出函数:
exports.index = async (req,res) => { }
exports.store = async (req,res) => { }
exports.delete = async (req,res) => { }
并且只使用一个删除函数而不是两个,存在名称冲突
我很确定您需要更改删除 post 的方式,目前您正在执行 user.removePost(post),这不是hasOne/belongsTo 关联(如果您使用的是 hasMany/belongsTo 关联,那么您应该不会有任何问题)。
此外,您应该将函数重命名为更具描述性,因为您有 2 个删除函数执行不同的操作
您需要 运行 Post.destroy() 在 post 本身上,我会删除用户的关联。 (因为 user.removePost(post)仅将其从用户中删除,而不会从数据库中删除)
module.exports = {
async deletePostByName (req, res) {
try {
const postName = req.query.name // Delete http requests usually use a query and not a body
await Post.destroy({
where: {
name: postName
}
})
res.status(200).send("Successfuly deleted post")
} catch (err) {
console.log(err)
res.status(500).send({
error: "There was an error deleting this post"
})
}
}
}
P.S:使用 post ID 而不是名称,因为名称不是唯一的
我正在尝试学习 sequelize v6。我已经创建了一个包含 3 tables(用户、posts 和评估)的数据库。在我的控制器文件夹中,我有三个文件(UserController.js、PostController.js 和 EvaluationController.js),我在其中设置默认控件,例如创建用户、创建 post 和创建评估,什么工作正常,但现在我试图在我的 PostController 中创建一个删除功能,但我不知道为什么它不工作。
这是我的 UserConroller 文件:
const User = require('../models/User');
const Post = require('../models/Post');
module.exports = {
async index (req, res) {
const { user_id } = req.params;
const user = await User.findByPk(user_id, {
include: { association: 'posts' }
});
return res.json(user.posts);
},
async store(req, res) {
const { user_id } = req.params;
const { description, image_url, latitude, longitude } = req.body;
const user = await User.findByPk(user_id);
if (!user) {
return res.status(400).json({ error: 'User not found' });
}
const post = await Post.create({ description, image_url, latitude, longitude, user_id });
return res.json(post);
},
async delete(req, res) {
const { user_id } = req.params;
const { name } = req.body;
const user = await User.findByPk(user_id);
if (!user) {
return res.status(400).json({ error: "User not found" });
}
const post = await Post.findOne({
where: { name }
});
await user.removeUser(post);
return res.json();
},
async delete(req, res) {
const { user_id } = req.params;
const { image_url } = req.body;
const user = await Post.findByPk(user_id);
if (!user) {
return res.status(400).json({ error: 'Post not found' });
}
const post = await Post.findOne({
where: { image_url }
});
await user.removePost(post);
return res.json();
}
};
在 routes.js 文件中,我有 post 的这些路由:
routes.get('/users/:user_id/post', PostController.index);
routes.post('/users/:user_id/post', PostController.store);
routes.delete('/users/:user_id/post', PostController.delete);
在我的模型文件夹中我有 Post.js 那是我使用 sequelize 来控制我的后端的地方:
const { Model, DataTypes } = require('sequelize');
class Post extends Model {
static init(sequelize) {
super.init({
description: DataTypes.STRING,
image_url: DataTypes.STRING,
latitude: DataTypes.STRING,
longitude: DataTypes.STRING,
}, {
sequelize
})
}
static associate(models) {
this.belongsTo(models.User, { foreignKey: 'user_id', as: 'owner' });
this.hasMany(models.Evaluation, { foreignKey: 'post_id', as: 'evaluations' });
}
}
module.exports = Post;
我已经在我的用户 table 中创建了 3 个用户,列如下:id、user_id 描述、image_url 纬度、经度、created_at、updated_at
当我尝试删除我用 id 1 创建的 post 时,user_id: 3,描述:任何描述,因为我想删除,image_url: https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2Ftse1.mm.bing.net%2Fth%3Fid%3DOIP.E4gCagrjAkQ5td5qjSc3rwHaE7%26pid%3DApi&f=1,纬度:-10.962526333931583,经度:-37.103513513954375,created_at:2021-08-13 23:56:58,和updated_at:2021-08-13 23:56:58,因为我已请求将 image_url 作为参数发送 我在数据库列中发送了相同的 image_url,但我的 post 没有被删除,我没有看到错误消息,而是JSON { "error": "Post not found" }
并在控制台中显示:
Executing (default): SELECT `id`, `description`, `image_url`, `latitude`, `longitude`, `created_at` AS `createdAt`, `updated_at` AS `updatedAt`, `user_id` FROM `posts` AS `Post` WHERE `Post`.`id` = '3';
删除我的 post 我错过了什么?
您导出函数的方式不对,您有两个删除函数。
像这样导出函数:
exports.index = async (req,res) => { }
exports.store = async (req,res) => { }
exports.delete = async (req,res) => { }
并且只使用一个删除函数而不是两个,存在名称冲突
我很确定您需要更改删除 post 的方式,目前您正在执行 user.removePost(post),这不是hasOne/belongsTo 关联(如果您使用的是 hasMany/belongsTo 关联,那么您应该不会有任何问题)。
此外,您应该将函数重命名为更具描述性,因为您有 2 个删除函数执行不同的操作
您需要 运行 Post.destroy() 在 post 本身上,我会删除用户的关联。 (因为 user.removePost(post)仅将其从用户中删除,而不会从数据库中删除)
module.exports = {
async deletePostByName (req, res) {
try {
const postName = req.query.name // Delete http requests usually use a query and not a body
await Post.destroy({
where: {
name: postName
}
})
res.status(200).send("Successfuly deleted post")
} catch (err) {
console.log(err)
res.status(500).send({
error: "There was an error deleting this post"
})
}
}
}
P.S:使用 post ID 而不是名称,因为名称不是唯一的