2016-08-01 85 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()'错误。 –

相关问题