【问题标题】:restify 2.6.1 how to disable body parser for specific requestrestify 2.6.1 如何为特定请求禁用正文解析器
【发布时间】:2025-12-08 11:25:01
【问题描述】:

我对 node.js 服务还很陌生,但我遇到了 multipart/form-data 内容类型的问题。我需要一种方法来禁用特定请求的正文解析器功能。 我正在使用restify 2.6.1。 下面是一些sn-p的配置。

我的设置是:

    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 解析器的东西都失败了)

提前致谢。

【问题讨论】:

    标签: node.js restify


    【解决方案1】:

    默认情况下,您不应该对每条路由都使用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);
    

    【讨论】:

      最近更新 更多