我正在用express和mongoose构建rest api。这是我从集合中删除文档的方式:
...
if (!req.session.user) return res.status(401).send()
const e = await Event.findOne({_id: req.params.eventId}).exec();
if (e.owner !== req.session.user) return res.status(403).send();
await Event.findOneAndDelete({_id: req.params.eventId}).exec();
return res.status(204).send()
...
我看到的问题是我在数据库中查询了一个文档两次,对我来说看起来不合适或效率很高。
仅通过一个查询执行此操作的正确方法是什么?
答案 0 :(得分:0)
您可以在删除查询中简单地传递所有者字段,并将所有者设置为req.session.user,如果将存在具有特定事件ID和所有者作为会话用户的文档,则将其删除。
if (!req.session.user) return res.status(401).send()
await Event.findOneAndDelete({_id: req.params.eventId, owner: req.session.user}).exec();
return res.status(204).send()
而且,由于mongodb在文档级别上没有对RBAC的内部支持,因此在许多用例中,您将必须进行多个查询来确定请求是否被授权执行某些操作。 您可以查看Casl library以获得更好的RBAC管理,它还支持内置的mongodb。