Подобные запросы $ http после того, как сначала застряли в ожидании, а затем потерпели неудачу с сервером NodeJS

0

Я получаю действительно странную проблему запроса с Угловым и Узлом, и я ничего не могу найти об этом.

У меня есть Угловой контроллер, который сначала извлекает данные и помещает их в область $ 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'));
  • 1
    Вы пытались добавить .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}}); Пожалуйста, не возвращайте подробные ошибки в производство!
  • 0
    К сожалению, это не помогло. Однако это замечательно, хотя, спасибо!
Показать ещё 2 комментария
Теги:
express

1 ответ

1

Я думаю, что проблема с Document.find может быть проблемой. Если у вас есть ошибка, она отправит ошибку, а затем попытается отправить doc, но вы не можете отправить два ответа. Просто перейдите на:

Documents.find({partId: letterParsed.partId},function(err, doc) {
   if (err) { 
      return res.send(err);
   }
   res.json(doc)
});
  • 0
    Не решение, но я определенно должен сделать это для лучшей практики, спасибо.
  • 0
    Не нужно, если вы используете обещания. Вы .catch() вместо ошибок.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню