AngularとNodeで本当に奇妙なリクエストの問題が発生しましたが、何も見つかりません。
最初にデータをフェッチして$ scopeに配置するAngularコントローラがあります。このコントローラには、コントローラがノードサーバーにPOSTしてデータを更新できるようにする関数もあります。更新すると、サーバーは更新された文書を送信します。
最初の更新(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:また が、ここで私のエクスプレス構成です:
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'));
コンソール出力でpromise chainに '.catch()'を追加しようとしましたか?コールバック関数は含まれているエラーで1つの引数をとります。 このような問題を避けるためには、すべての約束を守り、クライアントに何が起こったのかを伝える必要があります(単純な500要求コードがどこに失敗したかを教えてくれます)。 〜と同様に 'Promise.all(...)。then(...)。catch(function(err){res.status(500).json({error:err}}))'。 –
残念ながら、これは役に立ちませんでしたが、これはお役に立ちました。ありがとうございます。 –
クライアントがフリーズするのは、2番目の要求がクラッシュし、サーバーから応答がないためです(拒否/誤った約束、キャッチされない例外等)... –