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

标签 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 文件最终是空的。有什么想法吗?

最佳答案

问题在于您使用 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/

相关文章:

iphone - 关于创建 iPhone Piano UI 的问题

node.js - 我如何在 ExpressJS 4.x 中上传文件

node.js - 如何防止 Node 在我的 NextJS/Express 应用程序中将异常记录到控制台?

node.js - 在同一端口上运行socket.io 2.0和Express 4.0+

javascript - 使用 json 构建下拉列表

iphone - 音频服务功能帮助

node.js - 如何使用用于开发/生产环境的 Webpack 处理自签名 SSL/TLS .pem 文件的移动?

node.js - nodemon - 应用程序崩溃 - 启动前等待文件更改

javascript - node-mongodb-native - 游标在每次调用期间返回 null 作为最后一个值

javascript - 在 Node.JS 中将多个音频文件合并/合并为一个