Javascript 禁用文件上载的bodyparser-Nodejs

Javascript 禁用文件上载的bodyparser-Nodejs,javascript,node.js,express,routes,body-parser,Javascript,Node.js,Express,Routes,Body Parser,这个问题很类似于。他们提供的答案是针对Express3的,我用更新后的Express4尝试了这个解决方案,但它似乎不起作用 我正在使用Node.js+Express构建一个web应用程序。我正在使用另一个库BodyParser来解析post参数。但是,我希望能够更精确地访问多部分表单数据发布—我需要将输入流通过管道传输到另一台服务器,并希望避免先下载整个文件 所有上传的文件都会自动解析并上传,在它们进入我的任何功能之前,都可以使用“request.files”使用 有没有一种方法可以让我在不禁用

这个问题很类似于。他们提供的答案是针对Express3的,我用更新后的Express4尝试了这个解决方案,但它似乎不起作用

我正在使用Node.js+Express构建一个web应用程序。我正在使用另一个库BodyParser来解析post参数。但是,我希望能够更精确地访问多部分表单数据发布—我需要将输入流通过管道传输到另一台服务器,并希望避免先下载整个文件

所有上传的文件都会自动解析并上传,在它们进入我的任何功能之前,都可以使用“request.files”使用

有没有一种方法可以让我在不禁用BodyParser的情况下禁用多部分formdata帖子的BodyParser

这是我的app.js文件。在这里,我定义了一个身份验证路由,它不应该除了任何文件,而只是一个令牌(POST参数)。我还定义了另一个称为上传的路由。此路由接受文件和POST参数(表单数据)。只有在身份验证路由允许的情况下,才会调用此路由。因此,在authentication路由中,我不希望表单数据被允许,但在上传路由中,我希望。因此,当我收到上传请求时,它将通过auth路径,然后是上传路径。因此,我需要允许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
});
我的上传路径如下所示:

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

与其禁用,为什么不在需要的路由/路由器上启用中间件呢

对于单个路由,您可以将其作为实际路由处理程序之前的另一个参数添加,例如:

app.post('/upload', bodyParser, (req, res) => {
  // route logic here
});

与其禁用,为什么不在需要的路由/路由器上启用中间件呢

对于单个路由,您可以将其作为实际路由处理程序之前的另一个参数添加,例如:

app.post('/upload', bodyParser, (req, res) => {
  // route logic here
});

将bodyParse中间件包装在一个函数中,该函数检查请求主体的内容类型是否为多部分:

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

将bodyParse中间件包装在一个函数中,该函数检查请求主体的内容类型是否为多部分:

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

我有一个设置,每个路由都首先通过身份验证路由,然后才能访问任何其他路由。我不希望此路由仅接受文件文本。auth路由具有next()函数,如果身份验证成功,该函数将请求传递到下一个路由。因此,如果路由选择auth route->upload route,则auth路由将需要接受表单数据,因为在原始请求中,文件/图像将是表单数据的一部分。我有一个设置,即每个路由都首先通过身份验证路由,然后才能访问任何其他路由。我不希望此路由仅接受文件文本。auth路由具有next()函数,如果身份验证成功,该函数将请求传递到下一个路由。因此,如果路由选择auth route->upload route,则auth路由将需要接受表单数据,因为在原始请求中,文件/图像将是表单数据的一部分。请向我们展示用于正文解析器的代码,因为您只能对某些内容类型或某些路由启用它,因此我们需要了解您正在执行的操作。一个解决方案是将上载处理程序放在主体解析器中间件之前。因此,上传路由在主体解析器中间件之前进行处理,因此它甚至从未看到请求。处理程序(中间件或路由处理程序)按照定义的顺序进行处理。另一个解决方案是将上传处理程序分离到他们自己的路由器中,该路由器上只有上传中间件。第一个建议是,如果我这样做了,那么身份验证路由就不起作用了。如果顺序是auth-route->bodyParser-declaration->upload-route,那么他就不会工作,因为auth-route需要body-parser。关于第二个解决方案,对不起,我不太清楚你的意思是什么?@jfriend00我只是尝试实现第一个解决方案,并对其进行测试。它不起作用,身份验证路由从未被调用,因为它首先找到上载路由,因为它位于bodyparser之上,而身份验证位于bodyparser之下。请向我们展示您用于bodyparser的代码,因为您只能对某些内容类型或某些路由启用它,所以我们需要查看您正在执行的操作。一个解决方案是放置上载主体解析器中间件之前的处理程序。因此,上传路由在主体解析器中间件之前进行处理,因此它甚至从未看到请求。处理程序(中间件或路由处理程序)按照定义的顺序进行处理。另一个解决方案是将上传处理程序分离到他们自己的路由器中,该路由器上只有上传中间件。第一个建议是,如果我这样做了,那么身份验证路由就不起作用了。如果顺序是auth-route->bodyParser-declaration->upload-route,那么他就不会工作,因为auth-route需要body-parser。关于第二个解决方案,对不起,我不太清楚你的意思是什么?@jfriend00我只是尝试实现第一个解决方案,并对其进行测试。它不起作用,身份验证路由永远不会被调用,因为它首先找到上传路由,因为它位于bodyparser之上,而身份验证位于bodyparser之下。这就是为什么你会得到巨额报酬的原因!非常感谢,它完全符合我的要求!这就是为什么你会得到这么多钱!非常感谢,它完全符合我的要求!