Я пытаюсь отлаживать приложение node, чтобы найти источник ошибки в моем журнале, который отображается только как "Error: Can't set headers after they are sent
", без информации трассировки или какого-либо контекста.
Как бы то ни было, я думаю, что теперь я исправил это... Я использую connect-timeout
, и я продолжал обрабатывать обратный вызов передается в асинхронную сетевую операцию, в результате которого обратный вызов в конечном итоге попытается выполнить res.send()
, несмотря на то, что req.timedout
был установлен на 'true' на connect-timeout
во время сетевой операции.
НО я все еще не понимаю, почему мой журнал не показывал информацию о трассировке для этой ошибки. В любом случае, когда в моем коде возвращается ошибка, я заношу ее в консоль с помощью:
console.log(err);
Если в объекте err
есть информация о трассировке, и это кажется помещенным в err.stack
, не следует, чтобы приведенный выше оператор выгружал все содержимое err
(включая err.stack
) на консоль журнал? Мое понимание заключается в том, что я не потерял бы какую-либо информацию, выполнив вышеуказанное, сравненное, например, в:
console.log(err.stack);
Но сообщения, такие как этот, кажется, предлагают другое (хотя связанный пост теперь обновлен).
Я действительно пойду дальше и добавлю соответствующий текст, чтобы помочь найти ошибку:
console.log('error in dodgyFunction:', err);
Но несмотря на это, я все еще получал только "Error: Can't set headers after they are sent
", без какого-либо контекста, который я бы сказал. Будет ли это потому, что это сообщение об ошибке консоли выводится во внешней библиотеке (например, express
)? Я думал, что внешние библиотеки должны отправлять ошибки обратно в основной код, с которым нужно иметь дело соответственно?
Изменить: здесь пример того, где я поставил свою проверку ошибок и тайм-аута, в верхней части функции обратного вызова, переданной в операцию async:
var execFile = require('child_process').execFile;
execFile('dodgycommand', options, function(error, stdout, stderr) {
if (req.timedout) {
console.log('timeout detected whilst running dodgycommand, so aborting...');
return;
}
if (error) {
console.log('error running dodgycommand:', error);
res.sendStatus(400);
return;
}
// ... it safe to continue ...
}
В основном я придерживаюсь этой же схемы.