我知道這個錯誤有很多執行緒,但我找不到任何接近我的用例的東西。
我有 ExpressJS 應用程式,其中一個端點加載影像并根據我的需要轉換影像。
這是我的代碼:
app.get('/test', (request, response) => {
require('https').get('https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_92x30dp.png', (image) => {
image.on('data', (data) => {
response.setHeader('Content-Type', 'text/plain');
response.end('wow')
});
});
});
此代碼以wow回應,但隨后服務器失敗
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at ServerResponse.setHeader (_http_outgoing.js:561:11)
at IncomingMessage.<anonymous> (/home/boris/_/idealo/caas/magnolia/image-processor/server.js:18:22)
at IncomingMessage.emit (events.js:400:28)
at addChunk (internal/streams/readable.js:290:12)
at readableAddChunk (internal/streams/readable.js:265:9)
at IncomingMessage.Readable.push (internal/streams/readable.js:204:10)
at HTTPParser.parserOnBody (_http_common.js:139:24)
at TLSSocket.socketOnData (_http_client.js:515:22)
at TLSSocket.emit (events.js:400:28)
at addChunk (internal/streams/readable.js:290:12) {
code: 'ERR_HTTP_HEADERS_SENT'
}
如何修復錯誤?
uj5u.com熱心網友回復:
這個答案擴展了已經評論過的內容。
image是您對 google 執行的請求的回應物件。回應本身是一個流。回應物件可以偵聽data每次有新資料通過流并被發出請求的服務器接收時觸發的事件。由于該data事件將多次觸發,因此您嘗試在已發送的回應上設定標頭。
因此,您正在尋找的是以某種方式保存收到的每一塊資料,然后將這些資料作為一個整體進行處理,最后發送您的回應。它可能看起來像下面這樣。在這里,Buffer.toString當我們處理影像時,該方法可能不是最好的方法,但它應該給出如何做到這一點的總體思路。
app.get('/test', (request, response) => {
require('https').get('https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_92x30dp.png', (image) => {
let data = "";
image.on('data', (chunk) => {
data = chunk.toString();
});
// end event will be triggered when every bit of the image was received
image.on("end", () => {
// process the image in here
response.setHeader("Content-Type", "plain/text");
response.end("wow");
})
});
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/434664.html
