[英]Can't set headers after they are sent after setting the content-type
我正在嘗試從服務器API獲取對象。
此API將其作為流。
由於其鍵(以.jpg等結尾),我可以得到它的mime。 我想發回帶有正確的type-mime的content-type,而不總是發送給application/octet-stream
。
我在npm mime
中發現它可以工作,但是當我轉到URL http://localhost:3000/file/myb/userId/test.jpeg
,服務器關閉並拋出:
http.js:691
throw new Error('Can\'t set headers after they are sent.');
^
Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (http.js:691:11)
at ServerResponse.res.setHeader (D:\Utilisateurs\A579871\Documents\GIT\shb- gitrepository-1\node_modules\express\node_modules\connect\lib\patch.js:63:22)
at ServerResponse.<anonymous> (D:\Utilisateurs\A579871\Documents\GIT\shb-gitrepository-1\node_modules\express\node_modules\connect\lib\patch.js:80:14)
at Array.forEach (native)
at ServerResponse.res.writeHead (D:\Utilisateurs\A579871\Documents\GIT\shb-gitrepository-1\node_modules\express\node_modules\connect\lib\patch.js:79:28)
at IncomingMessage.<anonymous> (D:\Utilisateurs\A579871\Documents\GIT\shb-gitrepository-1\server.js:49:17)
at IncomingMessage.EventEmitter.emit (events.js:95:17)
at IncomingMessage.<anonymous> (_stream_readable.js:746:14)
at IncomingMessage.EventEmitter.emit (events.js:92:17)
at emitReadable_ (_stream_readable.js:408:10)
我找到了與此主題相關的主題,並嘗試使用建議而未找到解決方案
這是我的代碼:
var express = require('express');
var http = require('http');
var mime = require('mime');
var app = express();
var maxAge = 31557600000;
var port = 3000;
app.use(express.static(__dirname + '/app'));
app.get('/file/:bId/:userId/:fileKey', function(req, res) {
var headersGet = {
'auth-format': 'UID',
'Authorization': req.params.userId
};
var optionsGet = {
host: 'localhost',
port: 5000,
path: '/' + req.params.bId + '/' + req.params.fileKey,
method: 'GET',
headers: headersGet
};
var reqGet = http.request(optionsGet, function(resGet) {
resGet.on('data', function(d) {
type = mime.lookup(req.params.fileKey);
var charset = mime.charsets.lookup(type);
var newHead = {};
if (charset) {
newHead = {
"Content-Type": type
};
} else {
newHead = {
"Content-Type": type,
"charset": charset
};
}
res.writeContinue();
res.writeHead(200, newHead);
res.write(d);
res.end(d);
});
});
reqGet.end();
reqGet.on('error', function(e) {
console.error(e);
});
});
app.listen(port);
console.log('Listening on port ' + port);
這里的主要問題是,您不能假設您將始終獲得單個“數據”事件。 相反,只需編寫一次標頭(如果要在“數據”事件中執行此操作,則使用布爾型保護變量,以便僅完成一次),然后寫入數據,並在resGet
的“ end”事件中結束響應。
或:編寫標頭(在“數據”事件之外),然后再resGet.pipe(res);
,完全刪除resGet
的'data'和'end'事件處理程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.