Javascript 节点JS阻止用户删除其他用户';s产品
我有一个用Node JS构建的REST API,目前我正在使用MongoDB作为我的数据库。我想防止用户删除另一个用户的产品,为此我检查了解码令牌中的userId是否与产品userId相同 产品模式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
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。你知道怎么解决这个问题吗?