В моем маршрутизаторе экспресс-приложений у меня есть маршруты для приема 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;
res.body
. Но я не сохраняю эти двоичные данные в базу данных изres.body
, как вы можете видеть в приведенном выше коде. - person Kaushal28   schedule 02.03.2018