如何发送readstream作为响应

时间:2018-11-30 06:47:04

标签: node.js http httprequest httpresponse filestream

当我尝试发送读取流作为响应时,我遇到错误

    var http = require('http'),
        fileSystem = require('fs'),
        path = require('path');

    http.createServer(function(request, response) {
        var filePath = path.join(__dirname, 'myfile.mp3');
        var stat = fileSystem.statSync(filePath);

        response.writeHead(200, {
            'Content-Type': 'audio/mpeg',
            'Content-Length': stat.size
        });

        var readStream = fileSystem.createReadStream(filePath);

response.send(readStream)
    })
    .listen(2000);

我想发送为response.send(readStream)而不是readStream.pipe(response); 有可能发送这样的邮件吗?

2 个答案:

答案 0 :(得分:0)

节点(以上代码中的response)中的HTTP响应对象是可写流。这意味着,如果我们有一个表示myfile.mp3内容的可读流,则只需将文件的内容传递到响应对象中即可。看起来像这样:

readStream.pipe(response)

这可以防止在发送文件(例如myfile.mp3)作为响应之前将其完全加载到内存中,这是建议的这样做的方式,以防止服务器端出现较大的内存压力。

是否可以不使用pipe()发送文件?

实际上,有一种方法无需使用pipe()就可以发送文件,但是不建议使用此方法,因为它首先将整个文件加载到内存中,然后将文件写入响应对象。无论如何,这是一个如何做的例子:

http.createServer(function(request, response) {
    var filePath = path.join(__dirname, 'myfile.mp3');
    var stat = fileSystem.statSync(filePath);

    response.writeHead(200, {
        'Content-Type': 'audio/mpeg',
        'Content-Length': stat.size
    });

    fs.readFile(filePath, (err, data) => {
      if (err) throw err;
      response.end(data);
    });
}).listen(2000);

答案 1 :(得分:0)

如果那是您真正想要的,那么您可以这样做:

stringToParse = '{"female": 16, "brand": 75, "male": 8}'
dataJson = JSON.parse(stringToParse)
console.log(dataJson)
console.log(dataJson.male)

否则为readStream.pipe(response):

var http = require('http'),
    fileSystem = require('fs'),
    path = require('path');

http.createServer(function(request, response) {
    var filePath = path.join(__dirname, 'myfile.mp3');
    var readStream = fileSystem.createReadStream(filePath);
    readStream.on('data', (data) => {
        response.writeHead(200, { 'Content-Type': 'audio/mpeg' });
        // response.write(Buffer.from(data));
        // response.end();
        response.end(Buffer.from(data));
    });
})
.listen(2000);