在带有猫鼬的 mongodb 中加载和保存文档
Load and save document in mongodb with mongoose
我有以 express 作为服务器端框架运行的节点。
我创建了以下端点:
app.post('/post/save', auth.auth, function (req, res) {
Post.findById(req.body._id, function (err, post) {
post = post || new Post();
post.author.name = req.user.getName();
post.author.id = req.user._id;
post.title = req.body.title;
post.body = req.body.body;
post.save(function (err, object) {
err && res.send(500);
res.status(200).send({ /*id: object._id*/ });
});
});
});
当我第一次称之为时,它有效。当我第二次调用它时,它失败了。请求只是保持挂起状态,并且从保存函数调用返回的对象是未定义的。
两个请求中都undefined
req.body._id
。我尝试连续创建 2 个新帖子。
我想做的是检查文档是否存在,如果存在,请更新它,然后保存它,或创建一个新文档。
我知道像 upsert 这样的东西存在,但我不能使用它,因为我需要预保存中间件来触发,而且它只在.save
之前触发。
任何人都可以看到错误吗?
如果你把你的逻辑放在一个回调上,然后 - 根据请求查询值创建或查找一个Post
,传递你的回调函数怎么办?只是不要忘记删除此作业:post.author.id = req.user._id;
app.post('/post/save', auth.auth, function (req, res) {
var callback = function(post) {
post.author.name = req.user.getName();
post.title = req.body.title;
post.body = req.body.body;
post.save(function (err, object) {
err && res.send(500);
res.status(200).send({ /*id: object._id*/ });
});
};
if (req.body._id) {
Post.findById(req.body._id, function (err, post) {
callback(post);
});
} else {
var post = new Post();
callback(post);
}
});
一旦我从模型中删除了unique
字段,并将集合放在数据库中,我的原始帖子就起作用了。
删除索引可能就足够了; 见列昂尼德·贝沙斯特尼斯的评论;
当您将字段设置为唯一时,猫鼬会创建一个唯一的字段 此字段上的索引。即使在删除后,此索引仍保留在MongoDB中 独一无二:真正的旗帜。删除集合索引应该可以解决 问题
相关文章:
- HTML5在画布中加载较小的图像并保存实际大小的图像
- 如何在浏览器重新加载时保存位置哈希状态
- Angular js,在选择元素上,我想 POST 数据以将其保存在数据库中,然后我想使用 PUT 更新它而无需重新加载
- 在页面加载之间保存画布
- 如何在画布上绘制(使用鼠标/触摸)、保存绘制的对象、存储、加载和操作
- 如何保存和加载HTML5画布到&来自localStorage
- Outlook加载项使用Javascript将附件保存到磁盘
- 保存对文件的更改而不重新加载页面
- 如何突出显示HTML内容并根据用户将其保存到数据库中以备将来加载
- 小册子:如何在数据库中保存各种标记位置并稍后加载
- 将图像从表单保存到本地存储并存储/加载它
- 将复选框选中的状态保存并加载到数据库
- 会话存储未保存或未加载
- 在浏览器中合并并保存加载的样式表到一个文件中
- 在Javascript中保存和加载不起作用
- 加载保存文本区域不起作用,如图所示
- 如何在角度UI中加载保存的可排序对象
- 更流畅的页面加载保存JQuery toggleClass设置
- 保存一个动能.层及其子层加载保存的页面
- 如何跨页面加载保存网格筛选器状态