使用Mongoose通过ObjectId查找MongoDB文档



我正试图通过ObjectId来更新MongoDB中的一个文档。工作流程如下(这是一个博客)。

  1. 通过传递标题和正文在MongoDB中创建一个新的帖子。ObjectId将自动创建
  2. 转到编辑帖子。它使用URL中的ObjectId从数据库中获取它,并将它显示在相同的新post表单中,只使用预先存在的值
  3. 当单击提交按钮时,我想通过ObjectId查找文档,并用post表单中的值更新数据库中的值

步骤1&第2步很好,但第3步似乎不起作用。它重定向到我需要的页面。但数据库尚未更新。它的价值和以前一样。

以下是更新后部分的相关代码:

app.js

app.post "/office/post/:id/update", ensureAuthenticated, routes.updatePost

路由/索引.js

mongoose = require 'mongoose'
ObjectId = mongoose.Types.ObjectId
Post = require '../models/Post'
...
updatePost: function(req, res) {
  var o_id, the_id;
  the_id = req.params.id;
  console.log(the_id); // 510e05114e2fd6ce61000001
  o_id = ObjectId.fromString(the_id);
  console.log(o_id); // 510e05114e2fd6ce61000001
  return Post.update({
    "_id": ObjectId.fromString(the_id)
  }, {
    "title": "CHANGE"
  }, res.redirect("/office/edit/posts"));
}

我正在使用Express和Mongoose。

如果有帮助的话,这也是后模型:

(function() {
  var Post, Schema, mongoose;
  mongoose = require('mongoose');
  Schema = mongoose.Schema;
  Post = new Schema({
    title: String,
    subhead: String,
    body: String,
    publish_date: {
      type: Date,
      "default": Date.now
    },
    mod_date: {
      type: Date,
      "default": Date.now
    }
  });
  module.exports = mongoose.model('Post', Post);
}).call(this);

下面是编辑博客文章视图的代码:

app.js

app.get("/office/post/:id/edit", ensureAuthenticated, routes.editPost);

路由/索引.js

editPost: function(req, res) {
  return Post.findById(req.params.id, function(err, post) {
    return res.render('edit-post', {
      post: post,
      title: post.title
    });
  });
}

问题是如何调用update

return Post.update({
    "_id": ObjectId.fromString(the_id)
}, {
    "title": "CHANGE"
}, res.redirect("/office/edit/posts"));

最后一个参数实际上会重定向页面,而update期望在更新完成时调用一个函数

你应该通过

return Post.update({
    "_id": ObjectId.fromString(the_id)
}, {
    "title": "CHANGE"
}, function(err, model) {
    if (err) // handleerr
    res.redirect("/office/edit/posts"));
});

这样,我们只有在模型成功更新后才重定向

相关内容

  • 没有找到相关文章

最新更新