使用mongoose在mongodb中加载和保存文档

时间:2014-11-24 12:54:29

标签: javascript node.js mongodb express 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*/ });
  });  
});

});

当我第一次打电话时,它有效。 当我第二次打电话时,它失败了。请求只是保持挂起状态,并且从save函数调用返回的对象是未定义的。

两个请求中的

req.body._idundefined。我尝试连续创建2个新帖子。

我想要做的是检查文档是否存在,是否存在,更新文档然后保存,或创建新文档。

我知道像upsert这样的东西存在,但是我无法使用它,因为我需要预先保存的中间件来触发,它只在.save之前触发。

有人能看到错误吗?

2 个答案:

答案 0 :(得分:1)

如果您将逻辑放入回调,然后 - 根据请求查询值创建或查找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);
    }
});

答案 1 :(得分:0)

我从模型中删除了unique字段后,我的原始帖子工作了,并将集合删除到数据库中。

放弃索引可能就足够了;见Leonid Beschastnys评论;

  

当您将字段设置为唯一时,Mongoose会创建一个唯一的字段   该字段的索引。即使删除后,此索引仍会在MongoDB中保留   独特:真正的旗帜。删除收集索引应解决您的问题   问题