2014-10-08 15 views
0

У меня есть действительно странная проблема с nodejs и выражением.Node.js express, таймаут «Невозможно установить заголовки после их отправки».

Одна из моих функций, которая обрабатывает запрос, должна получить что-то из БД и отправить его как JSON клиенту.

Так это выглядит следующим образом:

  1. Получить запрос
  2. вызовов DB
  3. данные процесса и упаковать его в JSON
  4. response.json (JSON)

Обычно это будет идти все нормально, но если есть тайм-аут между 2 и 3, потому что он асинхронно, он автоматически создаст ответ, и появится ошибка «Can \ t t h когда они будут отправлены ». когда я звоню 4

У кого-нибудь еще есть эта проблема? Есть ли нормальный способ справиться с этим, или мне просто нужно проверить, настроен ли response._header?

exports.appstimebygroup = function (req, res) { 
    var resp = {}; 
    var clientId = Webapi.extractClientId(req); 

    AppTime.getByGroupId(clientId, req.body.groupId, function(error, appstime){ 
     if (error) { 
      handleError(error); 
      resp.returnCode = 0; 
      resp.message = "Some error have happened, please contact support!"; 
      res.setHeader("Content-Type", "application/json"); 
      res.json(resp); 
      return; 
     } 

     resp.returnCode = 1; 
     resp.appstime = appstime; 

     if(res._header){ 
      console.log("header allready set!"); 
      return; 
     } 

     res.setHeader("Content-Type", "application/json"); 
     res.json(resp); 
    }); 
}; 

И AppTime.getByGroupId имеет асинхронный вызов внутри.

+0

Мое предположение заключается в том, что вы не ожидаете завершения своих асинхронных запросов перед отправкой ответа, поэтому вы пытаетесь отправить ответ дважды на тот же запрос. Отправьте соответствующий код, и мы сможем узнать наверняка. – mscdex

+0

Я добавил код. Но, как я уже описал, в коде нет проблем. Проблема заключается в тайм-ауте, потому что тайм-аут происходит в середине асинхронного вызова, а затем выражает заголовок набора и отправляет его. И когда звонок закончен, моя функция попытается сделать это снова. Я также могу повторить эту ошибку отдельно. –

+1

Я тут не вижу ничего плохого. Что делает 'handleError'? Кроме того, почему вы настраиваете заголовок «Content-Type»? 'res.json' уже делает это за вас -> [LINK] (https://github.com/strongloop/express/blob/12f92a50dc59887c30f4c6f23fdfbfc616dcbef5/lib/response.js#L232) – Jordonias

ответ

0

Хорошо, проблема заключается в многократном времени обработки данных.

Когда это произойдет, он вызывает следующее (err).

form.on('error', function(err){ 
    if (!options.defer) { 
     err.status = 400; 
     next(err); 
    } 
    done = true; 
    }); 

По умолчанию на ошибку, он будет делать res.send (400), и когда обычно получает код, который вы хотите быть казнены есть проблема.

Смежные вопросы