为文件上传禁用 bodyparser - Nodejs
Disable bodyparser for file uploads - Nodejs
这个问题与How to disable Express BodyParser for file uploads (Node.js)非常相似。他们提供的答案是针对 Express3 的,我已经尝试了更新的 Express 4 的解决方案,但它似乎不起作用。
我正在使用 Node.js + Express 构建 Web 应用程序。我正在使用另一个库 BodyParser 来解析 post 参数。但是,我希望能够更精细地访问多部分表单数据 POSTS - 我需要将输入流通过管道传输到另一台服务器,并且希望避免先下载整个文件。
所有文件上传都会在它们到达我的任何功能之前使用 "request.files" 自动解析和上传并可用。
有没有办法让我禁用多部分表单数据 post 的 BodyParser,而不禁用其他所有内容?
这是我的 app.js 文件。在这里,我定义了一个身份验证路由,除了任何文件,它不应该只是一个令牌(POST 参数)。我还定义了另一条名为上传的路线。此路由接受文件以及 POST 参数(表单数据)。仅当身份验证路由允许时才调用此路由。因此,在身份验证路径中,我不希望允许使用表单数据,但在上传路径中,我希望允许。因此,当我收到上传某些内容的请求时,它将通过身份验证路由,然后通过上传路由。因此,我需要允许 auth 路由允许我不想要的文件(表单数据)。所以我希望 bodyparser 在 auth 路由中工作,而我在上传路径中使用 mutler(另一个库)来解析我的上传文件。在我的实际应用程序中,当然我有更多的路线,并且希望以最少的冗余尽可能干净地编码它。
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({
extended: true
}));
var route_auth = require('./routes/auth');
app.use('/api/post/*', route_auth);
var route_upload = require('./routes/post/upload');
app.use('/api/post/upload', route_upload );
app.listen(3000, function() {
console.log('Server listening on port 3000!')
});
我的授权路线看起来像这样:
router.post("/", function(req, res, next) {
if(everythingiscool){
return next()
}
next(err);
});
我的上传路径是这样的:
var express = require('express');
var router = express.Router();
var multer = require('multer')
var upload = multer({ dest: 'uploads/' });
router.post("/", upload.single('avatar'), function(req, res, next) {
//work with req.file
});
为什么不在 routes/routers 需要的地方 启用 中间件而不是禁用它?
对于个别路由,您可以将其作为另一个参数添加到实际路由处理程序之前,例如:
app.post('/upload', bodyParser, (req, res) => {
// route logic here
});
将 bodyParse 中间件包装在一个检查请求正文的 Content-Type 是否为多部分的函数中:
var isMultipart = /^multipart\//i;
var bodyParser = require('body-parser');
var urlencodedMiddleware = bodyParser.urlencoded({ extended: true });
app.use(function (req, res, next) {
var type = req.get('Content-Type');
if (isMultipart.test(type)) return next();
return urlencodedMiddleware(req, res, next);
});
这个问题与How to disable Express BodyParser for file uploads (Node.js)非常相似。他们提供的答案是针对 Express3 的,我已经尝试了更新的 Express 4 的解决方案,但它似乎不起作用。
我正在使用 Node.js + Express 构建 Web 应用程序。我正在使用另一个库 BodyParser 来解析 post 参数。但是,我希望能够更精细地访问多部分表单数据 POSTS - 我需要将输入流通过管道传输到另一台服务器,并且希望避免先下载整个文件。
所有文件上传都会在它们到达我的任何功能之前使用 "request.files" 自动解析和上传并可用。
有没有办法让我禁用多部分表单数据 post 的 BodyParser,而不禁用其他所有内容?
这是我的 app.js 文件。在这里,我定义了一个身份验证路由,除了任何文件,它不应该只是一个令牌(POST 参数)。我还定义了另一条名为上传的路线。此路由接受文件以及 POST 参数(表单数据)。仅当身份验证路由允许时才调用此路由。因此,在身份验证路径中,我不希望允许使用表单数据,但在上传路径中,我希望允许。因此,当我收到上传某些内容的请求时,它将通过身份验证路由,然后通过上传路由。因此,我需要允许 auth 路由允许我不想要的文件(表单数据)。所以我希望 bodyparser 在 auth 路由中工作,而我在上传路径中使用 mutler(另一个库)来解析我的上传文件。在我的实际应用程序中,当然我有更多的路线,并且希望以最少的冗余尽可能干净地编码它。
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({
extended: true
}));
var route_auth = require('./routes/auth');
app.use('/api/post/*', route_auth);
var route_upload = require('./routes/post/upload');
app.use('/api/post/upload', route_upload );
app.listen(3000, function() {
console.log('Server listening on port 3000!')
});
我的授权路线看起来像这样:
router.post("/", function(req, res, next) {
if(everythingiscool){
return next()
}
next(err);
});
我的上传路径是这样的:
var express = require('express');
var router = express.Router();
var multer = require('multer')
var upload = multer({ dest: 'uploads/' });
router.post("/", upload.single('avatar'), function(req, res, next) {
//work with req.file
});
为什么不在 routes/routers 需要的地方 启用 中间件而不是禁用它?
对于个别路由,您可以将其作为另一个参数添加到实际路由处理程序之前,例如:
app.post('/upload', bodyParser, (req, res) => {
// route logic here
});
将 bodyParse 中间件包装在一个检查请求正文的 Content-Type 是否为多部分的函数中:
var isMultipart = /^multipart\//i;
var bodyParser = require('body-parser');
var urlencodedMiddleware = bodyParser.urlencoded({ extended: true });
app.use(function (req, res, next) {
var type = req.get('Content-Type');
if (isMultipart.test(type)) return next();
return urlencodedMiddleware(req, res, next);
});