【发布时间】:2019-08-18 05:27:26
【问题描述】:
我正在尝试检查 用户 在更新文档之前是否拥有该文档或删除它,并希望尽可能保持此文档干燥。理想情况下,我不必必须对数据库进行两次调用,而我首先要在findById().then(doc => {check if user owns document and then -> doc.findByIdAndUpdate() }) 处调用数据库,而是将其保留为对数据库的一次调用。
我经常不得不对 express routes 执行此检查,并考虑在 mongoose .pre('update') 中间件上实现这一层逻辑。但我不知道如何将传入的 userid 从 req 对象 传递给我的中间件验证功能?
有没有更好的层来实现这个检查功能?还是每次我想检查用户是否拥有文档并在每个快速路由中写出时,我都必须向数据库发出两个请求?
我目前的实现是:
const addDocToDoc = (req, res, next) => {
let doc1id = req.params.id;
let doc2id = req.params.doc2id;
Doc1.findById(doc1id)
.then(doc1 => {
if(userCanAlter(doc1, req.user, res)) {
doc1.doc2s.push(doc2id)
return doc1.save().then(updatedDoc1 => res.send(updatedDoc1))
}
}).catch(next)
}
userCanAlter() 看起来像这样:
function userCanAlter(instance, user, res) {
if (!instance) { res.status(404).send("Document does not exist."); return false}
if (instance.user != user) { res.status(401).send("User unauthorized"); return false}
else return true;
}
显然,这是一个非常简单的更新,但更复杂的更新需要在保存之前进行更多配置。
【问题讨论】:
标签: node.js mongodb express mongoose