Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 节点JS阻止用户删除其他用户';s产品_Javascript_Node.js_Mongodb_Api_Mongoose - Fatal编程技术网

Javascript 节点JS阻止用户删除其他用户';s产品

Javascript 节点JS阻止用户删除其他用户';s产品,javascript,node.js,mongodb,api,mongoose,Javascript,Node.js,Mongodb,Api,Mongoose,我有一个用Node JS构建的REST API,目前我正在使用MongoDB作为我的数据库。我想防止用户删除另一个用户的产品,为此我检查了解码令牌中的userId是否与产品userId相同 产品模式 const mongoose = require("mongoose"); const productSchema = mongoose.Schema( { _id: mongoose.Schema.Types.ObjectId, userId: mongoose.Schema

我有一个用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方法


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

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

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

Product.deleteOne({u-id:id,userId:req.user.\u-id})

希望有帮助

这样做是可以的,因为您可能希望通知用户他们试图删除的产品不存在,但是您始终可以在
deleteOne
方法中同时指定userId和productId。一个
findById
和一个
deleteOne
也不是低效的。你在做毫无意义的微优化。嘿,多亏了你和盖伊·因克尼托,它成功了:)嘿@typicallearner和@盖伊·因克尼托。我像你说的那样更新了我的方法:
exports.deleteProduct=(req,res)=>{const-id=req.params.productId;Product.deleteOne({u-id:id,userId:req.user.},(err,result)=>{if(err){return res status(401.json(“未授权”)}return res status(200.json(“产品已删除”)}),但我一直处于状态200,并且产品未被删除。我认为这是因为我发送给deleteone回调函数的err参数为null。你知道怎么解决这个问题吗?