Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 接收wav文件并将其写入Node/Express服务器上的磁盘_Node.js_Audio_Express - Fatal编程技术网

Node.js 接收wav文件并将其写入Node/Express服务器上的磁盘

Node.js 接收wav文件并将其写入Node/Express服务器上的磁盘,node.js,audio,express,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' })); ... a

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

问题在于您对主体解析器中间件的使用。这将把整个文件读入内存,因此,req流将被完全读取。这意味着您以后无法将其通过管道传输到文件,因为所有数据都已被读取

您有两个选择:

根本不使用主体解析器,将请求流通过管道传输到文件remove app.usebodyParser.raw。。。剩下的代码将按预期工作; 将主体解析器保留在中,并将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);
  });
});
两者都有优点和缺点:不使用主体解析器意味着您必须自己检查正确的内容类型,并限制允许上传的数据量,这可能会很有用

但使用主体解析器意味着所有上传的文件都会首先完全读入内存,尤其是对于大量请求,这会耗尽服务器的内存

可选地,您可以考虑将文件作为多部分/表单数据上载,这样您就可以使用类似于可配置的东西。 cURL也可以处理这个问题:

curl -XPOST -F file@hello.wav http://127.0.0.1:3000/extract_indicators/audio/darksigma

问题在于主体解析器中间件的使用。这将把整个文件读入内存,因此,req流将被完全读取。这意味着您以后无法将其通过管道传输到文件,因为所有数据都已被读取

您有两个选择:

根本不使用主体解析器,将请求流通过管道传输到文件remove app.usebodyParser.raw。。。剩下的代码将按预期工作; 将主体解析器保留在中,并将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);
  });
});
两者都有优点和缺点:不使用主体解析器意味着您必须自己检查正确的内容类型,并限制允许上传的数据量,这可能会很有用

但使用主体解析器意味着所有上传的文件都会首先完全读入内存,尤其是对于大量请求,这会耗尽服务器的内存

可选地,您可以考虑将文件作为多部分/表单数据上载,这样您就可以使用类似于可配置的东西。 cURL也可以处理这个问题:

curl -XPOST -F file@hello.wav http://127.0.0.1:3000/extract_indicators/audio/darksigma

解决方案不起作用。如果没有主体解析器,就没有req.body。@dev\u在使用主体解析器时,原始问题将req传输到一个可写流。我的回答解释了为什么这行不通。如果删除body-parser.Solution不起作用,它不会声明或暗示req.body将存在。如果没有主体解析器,就没有req.body。@dev\u在使用主体解析器时,原始问题将req传输到一个可写流。我的回答解释了为什么这行不通。如果删除主体解析器,它不会声明或暗示req.body将存在。