【发布时间】:2017-08-12 13:11:40
【问题描述】:
这个问题与How to disable Express BodyParser for file uploads (Node.js) 非常相似。他们提供的答案是针对 Express3 的,我已经尝试了使用更新后的 Express 4 的解决方案,但它似乎不起作用。
我正在使用 Node.js + Express 构建一个 Web 应用程序。我正在使用另一个库 BodyParser 来解析 post 参数。但是,我希望在多部分表单数据 POST 出现时对其进行更精细的访问 - 我需要将输入流通过管道传输到另一台服务器,并且希望避免先下载整个文件。
所有上传的文件都会在到达我的任何函数之前自动解析并使用“request.files”上传并可用。
有没有办法让我为多部分表单数据帖子禁用 BodyParser,而不为其他所有内容禁用它?
这是我的 app.js 文件。在这里,我定义了一个身份验证路由,它不应该除了任何文件只是一个令牌(POST 参数)。我还定义了另一个称为上传的路线。此路由接受文件和 POST 参数(表单数据)。仅当身份验证路由允许时,才会调用此路由。因此,在身份验证路线中,我不希望允许表单数据,但在上传路线中我愿意。因此,当我收到上传某些内容的请求时,它将通过身份验证路由,然后是上传路由。因此,我需要允许身份验证路由允许我不想要的文件(表单数据)。所以我希望 bodyparser 在我的上传路径中使用 mutler (另一个库)来解析我的上传文件时,在 auth 路由中工作。当然,在我的实际应用程序中,我有更多的路线,并且希望以最少的冗余将其编码得尽可能干净。
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
});
【问题讨论】:
-
请向我们展示您用于 body-parser 的代码,因为您只能为某些内容类型或某些路由启用它,所以我们需要看看您在做什么。
-
一种解决方案是将上传处理程序放在正文解析器中间件之前。所以上传路由在 body-parser 中间件之前处理,因此它甚至看不到请求。处理程序(中间件或路由处理程序)按定义的顺序进行处理。另一种解决方案是将上传处理程序分离到他们自己的路由器中,该路由器上只有上传中间件。
-
如果我这样做了第一个建议,那么身份验证路由将不起作用。如果命令是 auth route -> bodyParser 声明 -> upload route,那么他不会工作,因为 auth route 需要 body 解析器。关于第二种解决方案,对不起,我不太清楚你的意思?
-
@jfriend00 我只是尝试实现它要测试的第一个解决方案。它不起作用,永远不会调用 auth 路由,因为它首先找到上传路由,因为它在 bodyparser 之上,而 auth 在 bodyparser 之下。
标签: javascript node.js express routes body-parser