как отправить readstream как ответ - PullRequest
0 голосов
/ 30 ноября 2018

когда я пытаюсь отправить поток чтения как ответ, я получаю сообщение об ошибке

    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);есть ли возможность отправить вот так?

1 Ответ

0 голосов
/ 30 ноября 2018

Объект ответа HTTP в узле (response в приведенном выше коде) является записываемым потоком.Это означает, что если у нас есть читаемый поток, представляющий содержимое 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);
...