javascript - 设置内容类型后发送后无法设置 header

标签 javascript node.js http express http-headers

我正在尝试从我的服务器 API 获取一个对象。

此 API 将其作为流。

由于它的 key (以 .jpg 等结尾),我可以获得它的 mime 。 我想发回具有正确类型 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)

我找到了有关该主题的主题,并尝试使用建议但没有找到解决方案

Error: Can't set headers after they are sent to the client

这是我的代码:

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);

最佳答案

这里的主要问题是您不能假设您总是会收到单个“数据”事件。相反,写入一次 header (如果您想在“数据”事件中执行此操作,请使用 bool 保护变量,以便只完成一次),写入数据,然后在 resGet 上end'事件,结束响应。

或者:写入 header (在“数据”事件之外)和 resGet.pipe(res);,删除 resGet 的“数据”并完全“结束”事件处理程序。

关于javascript - 设置内容类型后发送后无法设置 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24784944/

相关文章:

javascript - 类型错误 : undefined is not an object (evaluating 'item.phoneNumbers[0]' )

javascript - 如何制作出像这样的页面效果呢?

javascript - Chrome 扩展历史 API 未显示所有结果?

javascript - Node.js 切片内存不足的非常大的缓冲区

python - 通过 Web 连接到 API 与 Python

javascript - 如何通过单击超链接来选中/取消选中复选框?

angularjs - 没有 Sails.js 等辅助工具的应用程序安全性

node.js - 运行 Nightwatch 时如何增加内存使用量

android - 如何通过 Android 安全地建立以下 HTTPS 连接

javascript - 在 Meteor 中调用 http 后更新模板