Javascript 具有JSON和二进制数据传递功能的Express Body解析器

Javascript 具有JSON和二进制数据传递功能的Express Body解析器,javascript,node.js,express,middleware,body-parser,Javascript,Node.js,Express,Middleware,Body Parser,在我的express应用程序路由器中,我有用于接受JSON数据和二进制数据的POST请求的路由。问题是,当我使用主体解析器传递JSON数据时,它还将二进制数据视为JSON,并在发布二进制数据时给出错误。i、 e.当我使用: app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false})); 当我删除它时,它只对二进制数据有效。以下是我发布二进制文件的路径 router.post('/file', fun

在我的express应用程序路由器中,我有用于接受JSON数据和二进制数据的POST请求的路由。问题是,当我使用主体解析器传递JSON数据时,它还将二进制数据视为JSON,并在发布二进制数据时给出错误。i、 e.当我使用:

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false}));
当我删除它时,它只对二进制数据有效。以下是我发布二进制文件的路径

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);
});
我还尝试将此文件路由移动到其他路由器。在这种情况下,当我没有设置任何关于主体解析器的内容时,它仍然会给出相同的错误

一个正确的修复方法是在设置body parser之前将此文件路由放置在我的主
app.js
中。
但我认为这不是一个好方法。我希望这些路由在单独的文件中

那么我在这里错过了什么?任何替代方案也将受到赞赏

编辑

根据答案,我首先分离出需要正文解析的路由器和不需要正文解析的路由器。还从我的主
应用程序中删除了bodu解析器。use()
现在在路由器中,我需要body解析器,我已经添加了这两行。但行为是一样的

当我添加这两行代码时,只有JSON REQUEST有效,当我删除时,只有二进制POST req有效。工作

这是我的更新代码:

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)});
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; 
    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;
additionRouter.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)});
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; 
    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;
mediaRouter.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)});
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; 
    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;
通过指定

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false}));
您的整个应用程序都使用body解析器中间件。您可以创建另一个中间件来处理是否使用主体解析器。例如:

const bodyParse = bodyParser.json();
app.use((req, res, next) => {
    if(req.originalUrl == "restOfUrl/file") next();
    else bodyParse(req, res, next);
});

您可能需要在所需的特定路径中使用multer,请选中此项,但我认为multer用于在
res.body
中获取二进制数据。但我并没有将这些二进制数据从
res.body
保存到数据库中,正如您在上面的代码中所看到的。谢谢您的回答。但请看更新后的问题。你能试试我在回答中提出的第二个建议吗。对我来说似乎更好。同样出于好奇,如果您定义app.use(require('./routes/mediaRouter'),会发生什么;应用程序使用前(需要('./路由/附加路由器');当你发送二进制文件时,请求是什么类型的?等等,我想我提供的URL是错误的。让我再检查一下,谢谢,它现在工作得很好。请删除答案的第一部分,以供其他可能来这里的人参考。