通过身份验证删除猫鼬中文档的有效方法

时间:2019-03-13 23:10:24

标签: express mongoose

我正在用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()

...

我看到的问题是我在数据库中查询了一个文档两次,对我来说看起来不合适或效率很高。

仅通过一个查询执行此操作的正确方法是什么?

1 个答案:

答案 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。