在设置了content-type后发送后,不能设置报头
Can't set headers after they are sent after setting the content-type
我正在尝试从我的服务器API获取对象。
这个API将它作为一个流。
我可以得到它的mime感谢它的密钥(以。jpg等结尾…)。我想用正确的mime类型发送回一个内容类型,而不是总是用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)
我发现了这个话题,并试图使用建议,但没有找到解决方案
错误:Can't设置发送到客户端的报头
下面是我的代码: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);
这里的主要问题是,您不能假设您总是获得单个'data'事件。相反,写一次头(如果您想在'数据'事件中这样做,则使用布尔保护变量,以便只完成一次),写数据,并在resGet
的'end'事件中结束响应。
或者:写头('data'事件之外)和resGet.pipe(res);
,完全删除resGet
的'data'和'end'事件处理程序。
相关文章:
- Django可以'不能在设置中导入ckeditor,但可以在shell中导入
- 为什么当async标志设置为false时,xmlhttprequest中的代码可以工作,而当它设置为true时却不能工作
- 设置AngularJS控制器属性不能是使用Coffeescript的最后一行
- 打字稿显示不能设置未定义的属性,如何解决
- 像Advanced Rest Client这样的Chrome应用可以设置引荐来源网址标头,而网站则不能
- 不能设置未定义的属性
- 为什么我不能在 JavaScript 中将对象属性设置为空字符串
- 为什么我不能在 Javascript 中或从代码隐藏中将焦点设置为 ASP.Net TextBox 控件
- JS:不能停止设置间隔与清除间隔
- 为什么我不能使用 .colspan 设置此元素的 colspan
- Jquery - 为什么我不能在 $.ajax 中访问/设置我的 var
- 不能用var设置边距:JavaScript,CSS和jQuery
- 不能使用 Angular.js 或 Javascript 将表中的行值设置为数组
- Unca不能将属性“innerHTML”设置为空
- 为什么我不能在节点中设置时刻区域设置
- 为什么不能将别名设置为 document.getElementById()
- 为什么我不能设置更多饼干
- 为什么我不能使用角度将此图像设置为链接
- 为什么我不能以编程方式为 TH 标签设置 colspan
- 为什么“设置超时”不能正常工作