javascript - 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 方法。
你能帮我找到一个更好的解决方案吗?
解决方案
正如 Guy Incognito 所提到的,您尝试做的是一件可以的事情,您可能希望保持这种方式,以防您要发送 404 状态,说明他们试图删除的产品不存在。
但是,如果您尝试仅使用一个请求来执行此操作
Product.deleteOne({ _id: id, userId: req.user._id })
希望能帮助到你!
推荐阅读
- python - Google Colab 错误:无法加载 Qt 平台插件“xcb”
- java - DownloadManager 在再次连接到互联网时进行多次相同的下载
- c# - 解决了!如何动态添加 onClick 侦听器和带有变量的方法调用到预制按钮?
- python - 创建子类时覆盖类定义中使用的全局变量
- docker - 我可以基于主机文件系统构建一个 docker 容器吗?
- reactjs - 如何将 svg 作为道具传递给可按压组件
- winapi - helloworld.exe 有时仅在命令行上提供输出
- java - 如何在vaadin和spring boot中开发动态多标签?
- angular - 类型错误:source.lift 不是函数
- cuda - 在“/tmp/tmpxft_0000120b_0000000-10_my_program”中未定义对“cublasCreate_v2”的引用