2016-08-01 22 views
0

我收到一個非常奇怪的請求與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')); 
+1

您是否嘗試過使用控制檯輸出將'.catch()'添加到您的承諾鏈中?回調函數接受1個帶有包含錯誤的參數。 爲了避免這樣的問題,你需要捕捉每一個承諾鏈,讓客戶知道發生了什麼(一個簡單的500請求代碼會告訴你它失敗的地方)。就像'Promise.all(...)。then(...)。catch(function(err){res.status(500).json({error:err}});'。請不要返回詳細生產中的錯誤! –

+0

不幸的是,這並沒有幫助,但是這很好記,不過謝謝! –

+0

客戶端死機的原因是因爲第二個請求崩潰,服務器沒有發送任何響應(拒絕/錯誤承諾,未捕獲的異常等等......) –

回答

1

我認爲' Document.find'部分可能是問題所在。如果你有錯誤,它會發送錯誤,然後嘗試發送文檔,但你不能發送兩個響應。只需更改爲:

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

不是一個解決方案,但我絕對應該這樣做,因爲最好的做法,謝謝 –

+0

如果使用promise,就不需要了,而是'.catch()'錯誤。 –

相關問題