Javascript 具有JSON和二进制数据传递功能的Express Body解析器
在我的express应用程序路由器中,我有用于接受JSON数据和二进制数据的POST请求的路由。问题是,当我使用主体解析器传递JSON数据时,它还将二进制数据视为JSON,并在发布二进制数据时给出错误。i、 e.当我使用: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
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是错误的。让我再检查一下,谢谢,它现在工作得很好。请删除答案的第一部分,以供其他可能来这里的人参考。