2017-04-10 9 views
1

私は少し新しくなっています(JavascriptのコールバックとES6を含む)。 NodeJS + Express + MongoDBを使用しています。

私はアイテムを更新するためにAjax関数を呼び出しています。成功したAjax呼び出しは決して実行されません。ここで

ここで(リアクトから呼び出された)私のAjax呼び出し

editBug : function(bug){ 

    console.log('about to edit bug with these values',bug); 
    $.ajax({ 
     url:'/api/bugs', 
     method: 'PUT', 
     data:bug 
    }) 
    .done((jqxhr) => { 
     console.log('succcess while editing the bug'); 
     this.setState({successVisible : true}); 
    }) 
    .fail((jqxhr) => { 
     console.log('error : ' + jqxhr); 
    }) 
}, 

は私のAPI関数です:

app.put('/api/bugs',function(req,res){ 

    //console.log('req',req); 
    console.log('query string : ',req.query); 
    console.log('query params : ',req.params); 
    console.log('query body: ',req.body); 
    let id = new ObjectID(req.body._id); 
    req.body._id = new ObjectID(req.body._id); 

    db.collection('bugs').replaceOne(
     {_id:id}, 
     req.body, 
     function(err,result){ 
      assert.equal(err,null); 
      console.log('Successfull replace!'); 
      res.status(200); 
     } 
    ); 
}); 

Successfull replace!ログが正しく、サーバー側に示されています。 about to edit bug with these valuesが正面に正しく表示されています。しかし、succcess while editing the bugのログはフロントエンドに表示されておらず、.doneの呼び出しは実行されないようです。

+1

'fail()'が呼び出されたかどうかは言及していません。 –

+0

jqueryのどのバージョンを使用していますか? jquery 1.6 –

+0

@ promtが追加されました@ freedomn-m 'fail()'は呼び出されません。 – nicolasdaudin

答えて

3

問題は、ノード側のブラウザに応答を返さないことです。以下のスニペットを試してみてください。

また、エラーを処理する必要があることを指摘したいと思います。 bugsが間違っている場合は、ブラウザに、意図した操作が失敗したことを示す500ステータスコードを通知することをお勧めします。私はこの部分を以下のスナップショットに追加しました

app.put('/api/bugs', function(req, res) { 

    //console.log('req',req); 
    console.log('query string : ', req.query); 
    console.log('query params : ', req.params); 
    console.log('query body: ', req.body); 
    let id = new ObjectID(req.body._id); 
    req.body._id = new ObjectID(req.body._id); 

    db.collection('bugs').replaceOne({ 
     _id: id 
    }, 
    req.body, 
    function(err, result) { 
     if (err) { 
     console.log('Failed replace'); 
     res.status(500).end(); // <- We set the response status code and end the request 
     } else { 
     assert.equal(err, null); 
     console.log('Successfull replace!'); 
     res.status(200).end(); // <- We set the response status code and end the request 
     } 
    } 
); 
}); 
+0

恐ろしい!それはうまくいった。私は正しいものとしてあなたの答えを選んだ。なぜなら、それは他のものよりも詳細である(真実でもある)からだ。あなたの急いで助けてくれてありがとう!そして、エラーを処理するためのビットです。実際に私はチュートリアルに従っています。そのため、私は「素早い」ものだけをやっているのです。しかし、あなたはまったく正しい – nicolasdaudin

3

Node.js側でレスポンスオブジェクトを終了する必要はありませんか? 応答オブジェクトにres.end();または何らかの応答を追加してみてください。

また、chrome(または他のブラウザの)ネットワークタブを使用して、実際にAJAXリクエストがどのように終了して、ハングアップまたは終了するかを確認できます。

+0

ありがとうございました。 res.end()は動作します! res.json(doc)を使用する前に、すべてをやっているように見える(ストリームを閉じてしまう)ので、私はそれについて考えなかった。 – nicolasdaudin

関連する問題