2016-08-01 8 views
0

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')); 
+1

コンソール出力でpromise chainに '.catch()'を追加しようとしましたか?コールバック関数は含まれているエラーで1つの引数をとります。 このような問題を避けるためには、すべての約束を守り、クライアントに何が起こったのかを伝える必要があります(単純な500要求コードがどこに失敗したかを教えてくれます)。 〜と同様に 'Promise.all(...)。then(...)。catch(function(err){res.status(500).json({error:err}}))'。 –

+0

残念ながら、これは役に立ちませんでしたが、これはお役に立ちました。ありがとうございます。 –

+0

クライアントがフリーズするのは、2番目の要求がクラッシュし、サーバーから応答がないためです(拒否/誤った約束、キャッチされない例外等)... –

答えて

1

私は思います " Document.find 'の部分が問題になる可能性があります。エラーがある場合は、エラーを送信してからdocを送信しようとしますが、2つの応答を送信することはできません。

Documents.find({partId: letterParsed.partId},function(err, doc) { 
    if (err) { 
     return res.send(err); 
    } 
    res.json(doc) 
}); 
+0

解決策ではありませんが、私はベストプラクティスのためにこれを行うべきです、ありがとう –

+0

約束を使用する場合は不要です。代わりにエラーを '.catch()'します。 –

関連する問題