2015-08-01 1 views
1

Я посылающего аудио файл на моем сервере Узел/Экспресс, используя следующие:Получите файл WAV и записать его на диск на Node/Express Server

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 заканчивается пустым. Есть идеи?

ответ

4

Проблема заключается в использовании вами промежуточного программного обеспечения 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 -XPOST -F [email protected] http://127.0.0.1:3000/extract_indicators/audio/darksigma 
+0

Решение не работает. без body-parser нет req.body. –

+0

@dev_doctor исходный вопрос, переданный 'req' в записываемый поток _while_ с использованием' body-parser'. Мой ответ объясняет, почему это не сработает. Он не указывает или не подразумевает, что 'req.body' будет существовать, если вы удалите' body-parser'. – robertklep

Смежные вопросы