Я запрашиваю SQL-сервер из экспресс-API с помощью модуля node-mssql и передаю строки (с некоторыми промежуточными шагами) в поток ответов.Я хочу избегать записи заголовков, пока не узнаю, что запрос не выдаст ошибку перед какими-либо строками, поэтому я могу отправить полезное сообщение об ошибке клиенту вместо завершения потока с помощью экспресс-обработчика по умолчанию.Тем не менее, express записывает заголовки по умолчанию в какой-то момент, и у меня возникают проблемы при его идентификации.
Я пытался записать заголовки в прослушивателе .once ('data',) в конвейере, но в этот момент некоторые по умолчаниюповедение написало заголовки для меня, и это приводит к ошибке.
let request = await new sql.Request(pool);
res.writeHead(200, {
'Transfer-Encoding': 'chunked',
'charset' : 'utf-8',
'Content-Type': 'application/json',
'Content-Encoding': 'gzip'
})
ndjsonStream.on('error', next)
request.pipe(ndjsonStream)
.pipe(transformer)
.pipe(gzip)
.pipe(res);
Вышеописанное работает, но не позволяет мне передать полезное сообщение об ошибке.
let request = await new sql.Request(pool);
ndjsonStream.once('data', () => {
res.writeHead(200, {
'Transfer-Encoding': 'chunked',
'charset' : 'utf-8',
'Content-Type': 'application/json',
'Content-Encoding': 'gzip'
})
})
ndjsonStream.on('error', next)
request.pipe(ndjsonStream)
.pipe(transformer)
.pipe(gzip)
.pipe(res);
request.query(query);
Это приводит к ошибке, потому что express заранее написал для меня несколько заголовков, прежде чем этот слушатель сработаетт.е. тип контента: текст / html.
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client