首页 > 解决方案 > Node JS 防止用户删除其他用户的产品

问题描述

我有一个用 Node JS 构建的 REST API,我目前正在使用 MongoDB 作为我的数据库。我想防止用户删除另一个用户的产品,为此我检查了解码令牌中的 userId 是否与产品 userId 相同。

产品架构

const mongoose = require("mongoose");

const productSchema = mongoose.Schema(
  {
    _id: mongoose.Schema.Types.ObjectId,
    userId: mongoose.Schema.Types.ObjectId,
    name: { type: String, required: true },
    price: { type: Number, required: true },
    productImage: { type: String, required: false },
    category: {
      type: mongoose.Schema.Types.ObjectId,
      ref: "Category",
      required: true
    },
    gender: { type: String, required: true }
  },
  { timestamps: { createdAt: "created_at" } }
);

module.exports = mongoose.model("Product", productSchema);

删除产品方法:

  const id = req.params.productId;
  Product.findById({ _id: id }).then((product) => {
    if (product.userId != req.user._id) {
      return res.status(401).json("Not authorized");
    } else {
      Product.deleteOne({ _id: id })
        .exec()
        .then(() => {
          return res.status(200).json({
            message: "Product deleted succesfully",
          });
        })
        .catch((err) => {
          console.log(err);
          return res.status(500).json({
            error: err,
          });
        });
    }
  });
};

正如你们首先看到的,我正在搜索执行 findByID 方法以访问产品的 userId 属性,然后我将响应中的 userId 与解码令牌中的 userId 进行比较。

我认为我的方法效率不高,因为它同时运行 findById 和 deleteOne 方法。

你能帮我找到一个更好的解决方案吗?

标签: javascriptnode.jsmongodbapimongoose

解决方案


正如 Guy Incognito 所提到的,您尝试做的是一件可以的事情,您可能希望保持这种方式,以防您要发送 404 状态,说明他们试图删除的产品不存在。

但是,如果您尝试仅使用一个请求来执行此操作

Product.deleteOne({ _id: id, userId: req.user._id })

希望能帮助到你!


推荐阅读