在设置了content-type后发送后,不能设置报头

Can't set headers after they are sent after setting the content-type

本文关键字:设置 不能 报头 content-type      更新时间:2023-09-26

我正在尝试从我的服务器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'事件处理程序。