Проблема заключается в использовании вами промежуточного программного обеспечения 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
Решение не работает. без body-parser нет req.body. –
@dev_doctor исходный вопрос, переданный 'req' в записываемый поток _while_ с использованием' body-parser'. Мой ответ объясняет, почему это не сработает. Он не указывает или не подразумевает, что 'req.body' будет существовать, если вы удалите' body-parser'. – robertklep