接收wav文件并将其写入Node / Express Server上的磁盘

时间:2015-08-01 05:29:00

标签: node.js audio express

我正在使用以下内容将音频文件发送到我的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文件最终为空。有什么想法吗?

1 个答案:

答案 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