具有JSON和二进制数据传递功能的Express Body Parser

问题描述 投票:1回答:1

在我的快递应用程序路由器中,我有接受JSON数据的POST请求以及二进制数据的路由。问题是当我使用body解析器传递JSON数据时,它还将二进制数据视为JSON,并在POST二进制数据时出错。即,当我使用时:

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);
});

我也尝试将此文件路由移动到其他路由器。在这种情况下,当我没有设置任何关于身体解析器的东西时,它仍然会给出相同的错误。

一个正常工作的修复是在设置正文解析器之前将此文件路由放在我的主app.js中。但我认为这不是一个好方法。我希望这些路由位于单独的文件中。

那么我在这里缺少什么?任何替代方案也将受到赞赏。

编辑

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

当我添加这两行时,只有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;
javascript node.js express middleware body-parser
1个回答
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);
});
© www.soinside.com 2019 - 2024. All rights reserved.