Я получаю действительно странную проблему запроса с Угловым и Узлом, и я ничего не могу найти об этом.
У меня есть Угловой контроллер, который сначала извлекает данные и помещает их в область $ scope, которая также имеет функцию, которая позволяет контроллеру POST на сервере Node обновлять данные. После обновления сервер отправляет обновленный документ.
Первый запрос обновления (POST) работает нормально, и данные возвращаются правильно. Однако любые последующие запросы застревают в "Ожидание" (просмотр в Chrome Dev Tools). Затем они проваливаются через ~ 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)
}
);
});
});
EDIT: Кроме того, вот моя конфигурация Express:
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'));
Я думаю, что проблема с Document.find может быть проблемой. Если у вас есть ошибка, она отправит ошибку, а затем попытается отправить doc, но вы не можете отправить два ответа. Просто перейдите на:
Documents.find({partId: letterParsed.partId},function(err, doc) {
if (err) {
return res.send(err);
}
res.json(doc)
});
.catch()
вместо ошибок.
.catch()
в цепочку обещаний с выводом на консоль? функция обратного вызова принимает 1 аргумент с содержащейся ошибкой. Чтобы избежать таких проблем, вам нужно перехватить каждую цепочку обещаний и сообщить клиенту, что произошло (простой код запроса 500 скажет вам, где произошел сбой).Promise.all(...).then(...).catch(function(err){ res.status(500).json({error: err}});
так жеPromise.all(...).then(...).catch(function(err){ res.status(500).json({error: err}});
Пожалуйста, не возвращайте подробные ошибки в производство!