2013-02-20 119 views
8

我試圖通過ObjectId來查找MongoDB中的文檔。工作流程如下(這是一個博客)。通過ObjectId和Mongoose查找MongoDB文檔

  1. 通過傳遞標題和正文在MongoDB中創建一個新帖子。 ObjectId是自動創建的。
  2. 前往編輯帖子。它使用URL中的ObjectId從數據庫中抓取ObjectId,並以相同的新帖子形式顯示它,只需使用預先存在的值。
  3. 當點擊提交按鈕時,我想通過ObjectId找到文檔,並使用表單中的值更新數據庫中的值。

步驟1 & 2工作正常,但步驟3似乎沒有工作。它重定向到我需要的頁面。但數據庫尚未更新。這與之前的價值相同。

下面是該更新後的部分相關代碼:

app.js

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

路線/ index.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和貓鼬。

這也是樁模型是否有幫助:

(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); 

路線/index.js

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

回答

3

問題是你怎麼罵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")); 
}); 

這樣,我們只有在模型成功更新後纔會重定向

+0

就是這樣,謝謝!雖然對於其他人,我也必須改變我引用_id的方式。這裏是updatePost的最終代碼: 'updatePost:function(req,res){ return Post.update({_id「:req.params.id },req.body.post,function(err,post) {err} {console.log(「Error」); } return res。重定向( 「/辦公室/編輯/帖」); }); }' – 2013-02-21 13:34:14

相關問題