我正在使用以下内容将音频文件发送到我的Node / Express服务器:
curl -X POST -H "Content-Type: audio/wav" --data-binary @"hello.wav" http://127.0.0.1:3000/extract_indicators/audio/darksigma
我正在使用以下代码:
...
app.use(bodyParser.raw({ type: 'audio/wav', limit: '50mb' }));
...
app.post('/extract_indicators/audio/:user_id', function (req, res) {
console.log("RECIEVED AUDIO TO EXTRACT INDICATORS: ", req.body);
var writeStream = fs.createWriteStream('sample.wav');
req.pipe(writeStream);
res.sendStatus(200);
});
但sample.wav
文件最终为空。有什么想法吗?
答案 0 :(得分:3)
问题是您使用body-parser
中间件。这会将整个文件读入内存,因此req
流将耗尽(完全读取)。这意味着您无法随后将其传输到文件中(因为已经读取了所有数据)。
您有两种选择:
body-parser
,并将请求流传输到文件中(删除app.use(bodyParser.raw(...))
,其余代码将按预期工作); 保留body-parser
并将req.body
写入文件:
app.post('/extract_indicators/audio/:user_id', function (req, res) {
fs.writeFile('sample.wav', req.body, function(err) {
res.sendStatus(err ? 500 : 200);
});
});
两者都有专业人士和不同意见:不使用body-parser
意味着您必须自己检查正确的内容类型,并限制允许上传的数据量(可能{ {3}}在那里很有用。
但使用 body-parser
意味着所有上传的文件都会先被完全读入内存,特别是对于大量请求,这会耗尽服务器的内存。
或者,您可以考虑允许将文件上传为multipart/form-data
,这样您就可以使用类似stream-meter
的内容,这是非常可配置的。
cURL也可以处理这个问题:
curl -XPOST -F file@hello.wav http://127.0.0.1:3000/extract_indicators/audio/darksigma