Express Body Parser с возможностью передачи JSON и двоичных данных

В моем маршрутизаторе экспресс-приложений у меня есть маршруты для приема POST-запроса данных JSON, а также двоичных данных. Проблема в том, что когда я использую анализатор тела для передачи данных JSON, он также рассматривает двоичные данные как JSON и выдает ошибку при отправке двоичных данных POST. то есть когда я использую:

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false}));

И когда я удаляю это, это работает только для двоичных данных. Ниже приведен мой маршрут для двоичного файла POSTing.

router.post('/file', function (req, res) {
    var gridfs = app.get('gridfs');
    var writeStream = gridfs.createWriteStream({
        filename: 'file_name_here'
    });
    writeStream.on('close', function (file) {
        res.send(`File has been uploaded ${file._id}`);
    });
    req.pipe(writeStream);
});

Я также пытался переместить этот маршрут файла на другой маршрутизатор. В этом случае, когда я ничего не устанавливаю в парсере тела, он все равно выдает ту же ошибку.

Одно из исправлений, которое работает правильно, заключается в размещении этого маршрута файла в моей основной папке app.js перед настройкой синтаксического анализатора тела. Но я думаю, что это не лучший подход. Я хочу, чтобы эти маршруты были в отдельных файлах.

Так что мне здесь не хватает? Любые альтернативы также будут оценены.

ИЗМЕНИТЬ

Согласно ответу, я сначала отделил свои маршрутизаторы, которые требуют разбора тела, а какие нет. Также удалил парсер bodu из моего основного app.use() Теперь в маршрутизаторе, в котором мне нужен парсер тела, я добавил эти 2 строки. Но поведение такое же.

Когда я добавляю эти 2 строки, работает только запрос JSON, а когда я удаляю, только двоичный запрос POST. работает.

Вот мой обновленный код:

app.js

    const express = require('express');
const app = module.exports = express();
const bodyParser = require('body-parser');

const port = 8080;


// //parsing incoming requests using body-parser middlewares
// app.use(bodyParser.json());
// app.use(bodyParser.urlencoded({ extended: false}));


//adding routes
app.use(require('./routes/additionRouter'));
app.use(require('./routes/mediaRouter'));

//catch 404 file not found here
app.use((req, res, next) => {
    const err = new Error('Page Not Found');
    err.status = 404;
    next(err);
});

//Error Handler
app.use((err, req, res, next) => {
    res.status(err.status || 500);
    res.send(err.message);
});

app.listen(port, () => {console.log('Server listening on port: ' + port)});

additionRouter.js

const express = require('express');
const router = express.Router();

var exported = require('../config/dbConnection');

 const bodyParser = require('body-parser');

 // parsing incoming requests using body-parser middlewares
 router.use(bodyParser.json());
 router.use(bodyParser.urlencoded({ extended: false}));

//Endpoint for adding new challenge
router.post('/endpoint1', (req, res, next) => {

});

module.exports = router; 

и mediaRouter.js

    const express = require('express');
const mediaRouter = express.Router();
const exported = require('../config/dbConnection');

exported.cb((gridfs) => {
    //For adding media files to database named 'mediadb'
    //POST http://localhost:8080/file
    mediaRouter.post('/file', function (req, res) {
        // var gridfs = app.get('gridfs');
        var writeStream = gridfs.createWriteStream({
            filename: 'file_name_here'
        });
        writeStream.on('close', function (file) {
            res.send(`File has been uploaded ${file._id}`);
        });
        req.pipe(writeStream);
    });

    //GET http://localhost:8080/file/[mongo_id_of_file_here]
    mediaRouter.get('/file/:fileId', function (req, res) {
        // var gridfs = app.get('gridfs');
        gridfs.createReadStream({
            _id: req.params.fileId // or provide filename: 'file_name_here'
        }).pipe(res);
    });

});


module.exports = mediaRouter;

person Kaushal28    schedule 02.03.2018    source источник
comment
Возможно, вам придется использовать multer на определенном маршруте, который вы хотите, проверьте это «доступ к необработанным данным сообщения в экспресс»> stackoverflow.com/questions/49029893/   -  person Giannis Mp    schedule 02.03.2018
comment
Но я думаю, что multer предназначен для получения двоичных данных в res.body. Но я не сохраняю эти двоичные данные в базу данных из res.body, как вы можете видеть в приведенном выше коде.   -  person Kaushal28    schedule 02.03.2018


Ответы (1)


Указав

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false}));

все ваше приложение использует промежуточное ПО парсера тела. Вы можете создать еще одно промежуточное ПО для обработки того, используется ли парсер тела. Например:

const bodyParse = bodyParser.json();
app.use((req, res, next) => {
    if(req.originalUrl == "restOfUrl/file") next();
    else bodyParse(req, res, next);
});
person Giannis Mp    schedule 02.03.2018
comment
Спасибо за ответ. Но, пожалуйста, смотрите обновленный вопрос. - person Kaushal28; 02.03.2018
comment
Можете ли вы попробовать второе предложение, которое я сделал в своем ответе. Мне кажется лучше. Также из любопытства, что произойдет, если вы определите app.use(require('./routes/mediaRouter')); перед app.use(require('./routes/additionRouter')); - person Giannis Mp; 02.03.2018
comment
когда вы отправляете двоичный файл, какой тип запроса? - person Giannis Mp; 02.03.2018
comment
Подождите, кажется, я неправильно указал URL. Позвольте мне проверить еще раз, - person Kaushal28; 02.03.2018
comment
Спасибо, теперь все работает отлично. Пожалуйста, удалите 1-ю часть ответа для других, кто может прийти сюда. - person Kaushal28; 02.03.2018
comment
Всегда пожалуйста - person Giannis Mp; 02.03.2018