2017-09-03 67 views
-1

後我的代碼片段通過jQuery發送DELETE請求,看起來像這樣:AJAX請求沒有完成添加快捷中間件

$(document).ready(function(){ 
$('.formula-block').on('click', function(e){ 
if (e.target.className == 'button-warning pure-button') { 
    $.ajax({ 
    url: '/formula-list/' + this.id, 
    type: 'DELETE', 
    success: reload 
    }); 
} 
}); 

function reload() { 
    window.location.reload(true); 
    } 
}); 

這工作得很好,直到我在我的應用程序更新的一箇中間件的。

我用下面的代碼片斷做出的MongoDB提供給我的計劃,我app.js文件:

app.use((req, res, next) => { 
    mongo.connect('mongodb://localhost:27017/formulas', (e, db) => { 
    if (e) return next(e); 
    req.db = db; 
    next(); 
}); 
}); 

不過,我最近添加下面的代碼行的最後一對括號前

req.on('end',() => { req.db.close(); }); 

現在我的AJAX請求中的SUCCESS部分不再有效。

我認爲這是因爲AJAX請求正在等待響應,並沒有得到它,因爲最後一行剪輯它,所以success永遠不會被調用。

我的主要問題是,我希望頁面刷新後的項目更新後的東西被刪除。我不知道這是怎麼發生的,但現在我的安排不再有效。

如果有幫助,下面是收到的DELETE請求的服務器端代碼:

router.delete('/formula-list/:id', function(req, res){ 
    var db = req.db.collection('users'); 
    var f_id = new ObjectID(req.params.id); 
    db.updateOne({"_id": new ObjectID(req.user.id)}, { $pull: { 
    "formulas": {"f_id": f_id} 
    }}, function(err, r){ 
     if(err) {throw err;} 
     assert.equal(null, err); 
    }); 
}); 
+0

看在Chrome調試器的網絡選項卡,看看你是否得到任何迴應從您的AJAX調用回,如果是這樣,這種反應是什麼。你首先需要知道什麼是回到客戶端,或者問題是沒有響應發送。 – jfriend00

+0

你在調用'res.send'嗎?順便說一句,在嘗試關閉連接或偵聽連接回調中的req end事件之前,您應該檢查db是否在req中定義。 –

+0

我沒有看到任何地方你實際發送的請求響應。直到你在服務器上執行'res.send(...)',瀏覽器纔會知道請求已經完成。所以,當你的數據庫操作完成時,你應該'res.send()'回到客戶端,以便知道請求已完成。 – jfriend00

回答

1

我不知道如何解決你的問題,但也許你可以通過添加error處理程序,以獲得一些見解您的AJAX調用:

$.ajax({ 
 
    url: '/formula-list/' + this.id, 
 
    type: 'DELETE', 
 
    success: reload, 
 
    error: function() { 
 
     console.log(arguments); 
 
    } 
 
    });

如果AJAX成功處理程序之前工作過,現在不再了,這可能是一個錯誤正在發生。希望這可以幫助!

+0

謝謝你的提示,但是當我運行這個時,沒有錯誤出現。 –

+0

嘗試一些調試。 1.確保發送了AJAX呼叫。 2.在後臺添加打印語句 希望你弄明白! –

+0

請求正在擊中。如果我手動刷新頁面,一切都會更新。就像我說的,在我添加'req.on('close')....'這個讓我陷入麻煩的語言之前,它工作得很好。 –

0

試着做類似complete: function(){reload}的東西,這樣ajax會在完成刪除功能後重新加載。

(附註:我已經碰到了這類問題之前,它只能在特定瀏覽器中工作,因爲別人不支持delete法)

希望它能幫助!

0

根據對我的問題的評論,問題是我沒有明確創建任何形式的響應與我的請求,這是問題。

我只需要將res.end()加到我的快遞代碼中,問題就解決了。

這奏效了:

router.delete('/formula-list/:id', function(req, res){ 
    var db = req.db.collection('users'); 
    var f_id = new ObjectID(req.params.id); 
    db.updateOne({"_id": new ObjectID(req.user.id)}, { $pull: { 
    "formulas": {"f_id": f_id} 
    }}, function(err, r){ 
      assert.equal(null, err); 
      assert.equal(1, r.modifiedCount); 
      }); 
    res.end(); 
});