无法从后端 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 而不是名称,因为名称不是唯一的