You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
157 lines
2.6 KiB
157 lines
2.6 KiB
/*! |
|
* body-parser |
|
* Copyright(c) 2014-2015 Douglas Christopher Wilson |
|
* MIT Licensed |
|
*/ |
|
|
|
'use strict' |
|
|
|
/** |
|
* Module dependencies. |
|
* @private |
|
*/ |
|
|
|
var deprecate = require('depd')('body-parser') |
|
|
|
/** |
|
* Cache of loaded parsers. |
|
* @private |
|
*/ |
|
|
|
var parsers = Object.create(null) |
|
|
|
/** |
|
* @typedef Parsers |
|
* @type {function} |
|
* @property {function} json |
|
* @property {function} raw |
|
* @property {function} text |
|
* @property {function} urlencoded |
|
*/ |
|
|
|
/** |
|
* Module exports. |
|
* @type {Parsers} |
|
*/ |
|
|
|
exports = module.exports = deprecate.function(bodyParser, |
|
'bodyParser: use individual json/urlencoded middlewares') |
|
|
|
/** |
|
* JSON parser. |
|
* @public |
|
*/ |
|
|
|
Object.defineProperty(exports, 'json', { |
|
configurable: true, |
|
enumerable: true, |
|
get: createParserGetter('json') |
|
}) |
|
|
|
/** |
|
* Raw parser. |
|
* @public |
|
*/ |
|
|
|
Object.defineProperty(exports, 'raw', { |
|
configurable: true, |
|
enumerable: true, |
|
get: createParserGetter('raw') |
|
}) |
|
|
|
/** |
|
* Text parser. |
|
* @public |
|
*/ |
|
|
|
Object.defineProperty(exports, 'text', { |
|
configurable: true, |
|
enumerable: true, |
|
get: createParserGetter('text') |
|
}) |
|
|
|
/** |
|
* URL-encoded parser. |
|
* @public |
|
*/ |
|
|
|
Object.defineProperty(exports, 'urlencoded', { |
|
configurable: true, |
|
enumerable: true, |
|
get: createParserGetter('urlencoded') |
|
}) |
|
|
|
/** |
|
* Create a middleware to parse json and urlencoded bodies. |
|
* |
|
* @param {object} [options] |
|
* @return {function} |
|
* @deprecated |
|
* @public |
|
*/ |
|
|
|
function bodyParser (options) { |
|
var opts = {} |
|
|
|
// exclude type option |
|
if (options) { |
|
for (var prop in options) { |
|
if (prop !== 'type') { |
|
opts[prop] = options[prop] |
|
} |
|
} |
|
} |
|
|
|
var _urlencoded = exports.urlencoded(opts) |
|
var _json = exports.json(opts) |
|
|
|
return function bodyParser (req, res, next) { |
|
_json(req, res, function (err) { |
|
if (err) return next(err) |
|
_urlencoded(req, res, next) |
|
}) |
|
} |
|
} |
|
|
|
/** |
|
* Create a getter for loading a parser. |
|
* @private |
|
*/ |
|
|
|
function createParserGetter (name) { |
|
return function get () { |
|
return loadParser(name) |
|
} |
|
} |
|
|
|
/** |
|
* Load a parser module. |
|
* @private |
|
*/ |
|
|
|
function loadParser (parserName) { |
|
var parser = parsers[parserName] |
|
|
|
if (parser !== undefined) { |
|
return parser |
|
} |
|
|
|
// this uses a switch for static require analysis |
|
switch (parserName) { |
|
case 'json': |
|
parser = require('./lib/types/json') |
|
break |
|
case 'raw': |
|
parser = require('./lib/types/raw') |
|
break |
|
case 'text': |
|
parser = require('./lib/types/text') |
|
break |
|
case 'urlencoded': |
|
parser = require('./lib/types/urlencoded') |
|
break |
|
} |
|
|
|
// store to prevent invoking require() |
|
return (parsers[parserName] = parser) |
|
}
|
|
|