How to disable Express BodyParser for file uploads (Node.js)

后端 未结 7 1894
深忆病人
深忆病人 2020-11-30 18:26

This seems like it should be a fairly simple question, but I\'m having a really hard time figuring out how to approach it.

I\'m using Node.js + Express to build a we

7条回答
  •  清歌不尽
    2020-11-30 19:08

    When you type app.use(express.bodyParser()), almost each request will go through bodyParser functions (which one will be executed depends on Content-Type header).

    By default, there are 3 headers supported (AFAIR). You could see sources to be sure. You can (re)define handlers for Content-Types with something like this:

    var express = require('express');
    var bodyParser = express.bodyParser;
    
    // redefine handler for Content-Type: multipart/form-data
    bodyParser.parse('multipart/form-data') = function(req, options, next) {
      // parse request body your way; example of such action:
      // https://github.com/senchalabs/connect/blob/master/lib/middleware/multipart.js
    
      // for your needs it will probably be this:
      next();
    }
    


    upd.

    Things have changed in Express 3, so I'm sharing updated code from working project (should be app.useed before express.bodyParser()):

    var connectUtils = require('express/node_modules/connect/lib/utils');
    
    /**
     * Parses body and puts it to `request.rawBody`.
     * @param  {Array|String} contentTypes Value(s) of Content-Type header for which
                                           parser will be applied.
     * @return {Function}                  Express Middleware
     */
    module.exports = function(contentTypes) {
      contentTypes = Array.isArray(contentTypes) ? contentTypes
                                                 : [contentTypes];
      return function (req, res, next) {
        if (req._body)
          return next();
    
        req.body = req.body || {};
    
        if (!connectUtils.hasBody(req))
          return next();
    
        if (-1 === contentTypes.indexOf(req.header('content-type')))
          return next();
    
        req.setEncoding('utf8');  // Reconsider this line!
        req._body   = true;       // Mark as parsed for other body parsers.
        req.rawBody = '';
    
        req.on('data', function (chunk) {
          req.rawBody += chunk;
        });
    
        req.on('end', next);
      };
    };
    

    And some pseudo-code, regarding original question:

    function disableParserForContentType(req, res, next) {
      if (req.contentType in options.contentTypes) {
        req._body = true;
        next();
      }
    }
    

提交回复
热议问题