我收到一个非常奇怪的请求与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}});'。请不要返回详细生产中的错误! –
不幸的是,这并没有帮助,但是这很好记,不过谢谢! –
客户端死机的原因是因为第二个请求崩溃,服务器没有发送任何响应(拒绝/错误承诺,未捕获的异常等等......) –