我收到一個非常奇怪的請求與Angular和Node的問題,我找不到任何關於它的東西。
我有一個Angular控制器最初獲取數據並將其放在$ scope中,然後它還有一個允許控制器POST到Node服務器更新數據的函數。更新後,服務器將發送更新的文檔。
第一次更新(POST)請求正常工作,並且數據正確返回。但是,任何後續請求都會陷入「待定」狀態(Chrome開發工具中的視圖)。他們然後失敗~2分鐘後,在控制檯net::ERR_EMPTY_RESPONSE
錯誤。只有在失敗後纔會顯示在節點控制檯中,但顯示爲:
POST /api/document/update?m=0.6154590881151583 - - ms -
其中那些-
的值反映了狀態碼,請求大小和用於響應的時間。
角控制器:
pushToServer = function() {
$http.post('/api/document/update',{
letter : $scope.document,
}).then(function successCallback(res){
console.log("all good" + JSON.stringify(res.data,null,3));
$scope.document= res.data[0];
}, function errorCallback(res){
console.log("arg " + res);
});
}
節點(快遞)部分
app.post('/api/document/update', function(req, res) {
var letterParsed = req.body.letter;
Documents.findOneAndUpdate(
{ issueId: letterParsed.issueId },
{ letterParsed },
{ upsert: true },
function(err, doc) {
if (err) throw err;
});
//FROM http://stackoverflow.com/a/38534012/1224973
let rowQueries = [];
letterParsed.rows.forEach(row => {
var query = Documents.findOneAndUpdate(
{
partId: letterParsed.partId,
'rows.$._id': row._id
}, {
$addToSet: {
'rows': row
}
}, {
upsert: true
});
rowQueries.push(query.exec());
});
Promise.all(rowQueries).then(updatedDocs => {
Documents.find({ partId: letterParsed.partId },
function(err, doc) {
if (err) { res.send(err); }
res.json(doc)
}
);
});
});
編輯: 另外,這裏是我的快速配置:
app.use(morgan('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.text());
app.use(bodyParser.json({ type: 'application/vnd.api+json'}));
app.use(methodOverride('X-HTTP-Method-Override'));
您是否嘗試過使用控制檯輸出將'.catch()'添加到您的承諾鏈中?回調函數接受1個帶有包含錯誤的參數。 爲了避免這樣的問題,你需要捕捉每一個承諾鏈,讓客戶知道發生了什麼(一個簡單的500請求代碼會告訴你它失敗的地方)。就像'Promise.all(...)。then(...)。catch(function(err){res.status(500).json({error:err}});'。請不要返回詳細生產中的錯誤! –
不幸的是,這並沒有幫助,但是這很好記,不過謝謝! –
客戶端死機的原因是因爲第二個請求崩潰,服務器沒有發送任何響應(拒絕/錯誤承諾,未捕獲的異常等等......) –