当我尝试发送读取流作为响应时,我遇到错误
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); 有可能发送这样的邮件吗?
答案 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);