解决2.6.1如何禁用特定请求的主体解析器

时间:2014-02-01 13:51:24

标签: node.js restify

我对node.js服务很新,我遇到了multipart / form-data内容类型的问题。我需要一种方法来禁用特定请求的主体解析器功能。 我正在使用restify 2.6.1。 以下是配置的一些片段。

我的设置是:

    App.js :

    server.use(restify.authorizationParser());
    server.use(restify.dateParser());
    server.use(restify.queryParser());
    server.use(restify.jsonp());

    server.use(restify.bodyParser());
    server.use(restifyValidator);
    server.use(restify.gzipResponse());
    server.use(passport.initialize());
    server.use(restify.conditionalRequest());


Route.js : 
       app.post({path: '/test/upload/:upload_image_name', version: ver}, uploadCtr.uploadImage);
       app.post( {path: '/test/upload/:upload_image_name', version:ver }, passport.authenticate('bearer',{ session: false}),uploadCtr.uploadImage);

没有restify.bodyParser()上传图片正在工作(但依赖于json解析器的所有内容都失败了)

提前致谢。

1 个答案:

答案 0 :(得分:11)

默认情况下,不应对每条路线使用bodyParser()。实际上,您只应将bodyParser()用于需要分段上传的路由。

  

使用express.bodyParser的所有服务器都容易受到攻击,这会在服务器上创建无限数量的临时文件,可能会占用所有磁盘空间,这可能会导致服务器挂起。

     

示范

     

这个问题很容易证明。这是一个简单的快递应用程序:

var express = require('express');
var app = express();

app.use(express.bodyParser());
app.post('/test', function(req, resp) {
  resp.send('ok');
});

app.listen(9001);
     

看起来非常无害吗?

     

现在用以下内容检查你有多少个临时文件:

$ ls /tmp | wc -l
33
     

接下来模拟上传多部分表单:

$ curl -X POST -F foo=@tmp/somefile.c http://localhost:9001/test
ok
     

返回并查看我们的临时文件计数:

$ ls /tmp | wc -l
34
     

这是一个问题。

http://andrewkelley.me/post/do-not-use-bodyparser-with-express-js.html

Restify也存在这个问题。

您可以将.bodyParser()替换为:

来解决问题
server.use( restify.queryParser() );
server.use( restify.jsonBodyParser() );

但是要回答关于特定路由的问题,您应该将所有路由不需要的任何中间件移动到路由特定的中间件中:

server.get('/route', restify.queryParser(), restify.jsonBodyParser(), routeHandler);

这也可以采用数组:

var routeMiddleware = [
      restify.queryParser(),
      restify.jsonBodyParser()
    ];

server.get('/route', routeMiddleware, routeHandler);