我使用以下命令将音频文件发送到我的 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
文件最终是空的。有什么想法吗?
最佳答案
问题在于您使用 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
意味着您必须自己检查正确的内容类型,并限制允许上传的数据量(也许 stream-meter
可以在那里很有用)。
但是使用 body-parser
意味着所有上传的文件都会首先完全读入内存,这(尤其是对于大量请求)可能会耗尽服务器的内存。
或者,您可以考虑允许将文件上传为 multipart/form-data
,这样您就可以使用类似 multer
的内容。 ,这是非常可配置的。
cURL 也可以处理这个问题:
curl -XPOST -F file@hello.wav http://127.0.0.1:3000/extract_indicators/audio/darksigma
关于node.js - 接收 wav 文件并将其写入 Node/Express Server 上的磁盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31758593/