index.js (2656B)
1 /*! 2 * body-parser 3 * Copyright(c) 2014-2015 Douglas Christopher Wilson 4 * MIT Licensed 5 */ 6 7 'use strict' 8 9 /** 10 * Module dependencies. 11 * @private 12 */ 13 14 var deprecate = require('depd')('body-parser') 15 16 /** 17 * Cache of loaded parsers. 18 * @private 19 */ 20 21 var parsers = Object.create(null) 22 23 /** 24 * @typedef Parsers 25 * @type {function} 26 * @property {function} json 27 * @property {function} raw 28 * @property {function} text 29 * @property {function} urlencoded 30 */ 31 32 /** 33 * Module exports. 34 * @type {Parsers} 35 */ 36 37 exports = module.exports = deprecate.function(bodyParser, 38 'bodyParser: use individual json/urlencoded middlewares') 39 40 /** 41 * JSON parser. 42 * @public 43 */ 44 45 Object.defineProperty(exports, 'json', { 46 configurable: true, 47 enumerable: true, 48 get: createParserGetter('json') 49 }) 50 51 /** 52 * Raw parser. 53 * @public 54 */ 55 56 Object.defineProperty(exports, 'raw', { 57 configurable: true, 58 enumerable: true, 59 get: createParserGetter('raw') 60 }) 61 62 /** 63 * Text parser. 64 * @public 65 */ 66 67 Object.defineProperty(exports, 'text', { 68 configurable: true, 69 enumerable: true, 70 get: createParserGetter('text') 71 }) 72 73 /** 74 * URL-encoded parser. 75 * @public 76 */ 77 78 Object.defineProperty(exports, 'urlencoded', { 79 configurable: true, 80 enumerable: true, 81 get: createParserGetter('urlencoded') 82 }) 83 84 /** 85 * Create a middleware to parse json and urlencoded bodies. 86 * 87 * @param {object} [options] 88 * @return {function} 89 * @deprecated 90 * @public 91 */ 92 93 function bodyParser (options) { 94 var opts = {} 95 96 // exclude type option 97 if (options) { 98 for (var prop in options) { 99 if (prop !== 'type') { 100 opts[prop] = options[prop] 101 } 102 } 103 } 104 105 var _urlencoded = exports.urlencoded(opts) 106 var _json = exports.json(opts) 107 108 return function bodyParser (req, res, next) { 109 _json(req, res, function (err) { 110 if (err) return next(err) 111 _urlencoded(req, res, next) 112 }) 113 } 114 } 115 116 /** 117 * Create a getter for loading a parser. 118 * @private 119 */ 120 121 function createParserGetter (name) { 122 return function get () { 123 return loadParser(name) 124 } 125 } 126 127 /** 128 * Load a parser module. 129 * @private 130 */ 131 132 function loadParser (parserName) { 133 var parser = parsers[parserName] 134 135 if (parser !== undefined) { 136 return parser 137 } 138 139 // this uses a switch for static require analysis 140 switch (parserName) { 141 case 'json': 142 parser = require('./lib/types/json') 143 break 144 case 'raw': 145 parser = require('./lib/types/raw') 146 break 147 case 'text': 148 parser = require('./lib/types/text') 149 break 150 case 'urlencoded': 151 parser = require('./lib/types/urlencoded') 152 break 153 } 154 155 // store to prevent invoking require() 156 return (parsers[parserName] = parser) 157 }