У меня есть действительно странная проблема с nodejs и выражением.Node.js express, таймаут «Невозможно установить заголовки после их отправки».
Одна из моих функций, которая обрабатывает запрос, должна получить что-то из БД и отправить его как JSON клиенту.
Так это выглядит следующим образом:
- Получить запрос
- вызовов DB
- данные процесса и упаковать его в JSON
- 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 имеет асинхронный вызов внутри.
Мое предположение заключается в том, что вы не ожидаете завершения своих асинхронных запросов перед отправкой ответа, поэтому вы пытаетесь отправить ответ дважды на тот же запрос. Отправьте соответствующий код, и мы сможем узнать наверняка. – mscdex
Я добавил код. Но, как я уже описал, в коде нет проблем. Проблема заключается в тайм-ауте, потому что тайм-аут происходит в середине асинхронного вызова, а затем выражает заголовок набора и отправляет его. И когда звонок закончен, моя функция попытается сделать это снова. Я также могу повторить эту ошибку отдельно. –
Я тут не вижу ничего плохого. Что делает 'handleError'? Кроме того, почему вы настраиваете заголовок «Content-Type»? 'res.json' уже делает это за вас -> [LINK] (https://github.com/strongloop/express/blob/12f92a50dc59887c30f4c6f23fdfbfc616dcbef5/lib/response.js#L232) – Jordonias