2017-09-16 11 views
0

文字列をIDで見つかったデータベースエントリに配列にプッシュしようとしています。データベースでMongoose(findByIdAndUpdate)クエリが更新されないのはなぜですか?

app.put('/todo/:id', urlencodedParser, function(req, res) { 
    Todo.findByIdAndUpdate({_id:ObjectId(req.params.id)}, 
     { "$push": { "item": req.body } }, 
     { "new": true, "upsert": true }, 
     function (err, data) { 
      if (err) throw err; 
      console.log("test"); 
     } 
    ); }); 

問題があるが、ログは私はこの方法では、これまで実際に呼び出されていないと思わせるコンソールに出力されることはありません:これは、putメソッドそのものです。私のように(送信ボタン、テキストボックスのクリアをクリックしたとき、私はそれが、私は送信ボタン上のputメソッドを呼び出して、フロントエンド部分、?:賢明

$('form').on('submit', function(){ 

     var item = $('form input'); 
     var todo = {item: item.val()}; 

     $.ajax({ 
     type: 'PUT', 
     url: '/todo/' + id, 
     data: todo, 
     success: function(data){ 
      location.reload(); 
     } 
     }); 

     return false; 

    }); 

行動、とは何かを持っていると仮定していますそれは)、そしてURLを変更します:

/todo/59bd48905a2ed911e0d480f2?item=item+to+be+inserted 

コンソールにログインするエラーはありません。どこが間違っていますか?

E:ここで

は同様に、私のスキーマです:、

var bodyParser = require('body-parser'); 
var urlencodedParser = bodyParser.urlencoded({extended: false}); 
+0

** findByIdAndUpdate **最初の引数として**だけ** IDを期待しています。 ** findOneAndUpdate **を使用して_idで一致させるオブジェクトを渡すことができます。 –

+0

@SteveHolgado Hm、req.params.idだけを渡しても助けにならなかったようです。 – treo

+0

私は、テキストボックスがクリアされて成功関数に達したと言っていることを理解していますか?もしそうなら、私はハンドラに応答がないのを見ます。 'urlencodedParser'ミドルウェアがリクエストに応答し、ハンドラのコールバックに到達できませんでしたか? –

答えて

1

オクラホマので、フロントエンドのコードで、あなたはでpreventDefaultを追加する必要があります。

var todoSchema = new mongoose.Schema({ 
    item: [String] 
}); 

は、ここでURLエンコードパーサですそして、あなたはid変数を定義していません。これは動作するはずです:

$('form').on('submit', function (event) { 
    event.preventDefault() 
    var item = $('form input') 
    var todo = {item: item.val()} 
    var path = window.location.pathname.split('/') 
    var id = path[2] 
    console.log(id) 
    $.ajax({ 
     type: 'PUT', 
     url: '/todo/' + id, 
     data: todo, 
     success: function (data) { 
     // do something with the data via front-end framework 
     location.reload() 
     } 
    }) 

    return false 
    }) 

し、サーバーにreq.body.itemを文字列化する必要はありません。

app.put('/todo/:id', urlencodedParser, function (req, res) { 
    console.log(req.body) 
    Todo.findByIdAndUpdate(req.params.id, 
     { '$push': { 'item': req.body.item } }, 
     { 'new': true, 'upsert': true }, 
     function (err, data) { 
     if (err) throw err 
     console.log('here') 
     res.end() 
     } 
    ) 
    }) 
+0

助けをありがとう、これは魅力のように働いた! – treo

関連する問題