2017-04-10 185 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? Promise被添加到jquery 1.6 –

+0

@ freedomn -m'失敗()'不被調用。 – 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