2013-02-20 16 views
8

MongoDBの文書をObjectIdで検索して更新しようとしています。ワークフローは以下の通りです(これはブログ用です)。MongooseでObjectIdでMongoDB文書を検索

  1. タイトルと本文を渡してMongoDBに新しい投稿を作成します。 ObjectIdが自動的に作成されます。
  2. 投稿を編集してください。 URLからの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関数が呼び出されることを期待し、更新が

完了すると、あなたは

に渡す必要があるのに対し、最後の引数は、実際に、ページをリダイレクトします update

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

を呼び出す方法です

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) { if(err){ console.log( "Error"); } リターンres。リダイレクト( "/ office/edit/posts"); }); } ' –

関連する問題