NodeJS 为什么express允许用一个被调用的函数来定义函数?

wr98u20j  于 2023-05-22  发布在  Node.js
关注(0)|答案(3)|浏览(163)

为什么express允许用一个被调用的函数来定义函数?通常,如果你定义一个函数或作为参数传递,你传递的是函数引用而不是调用。
当我第一次看到中间件示例时,我期望它是:

app.use(express.json); 
app.use(express.urlencoded);
var myfunction = function() {};
app.use(myfunction);

但我看到的是

app.use(express.json());
app.use(express.urlencoded());

注意,参数大括号字符,()这些被调用的函数是否返回一个函数?
仅供参考,VSCode没有遵循这些方法上的引用,所以我看不到它返回的内容。

更新

我可以自己调用函数并检查结果是什么。brb... back my app is in the middle of work and not launchable.

sxpgvts3

sxpgvts31#

您没有在这里“定义”任何东西--您调用的是use函数,该函数应该接收一个函数作为其参数。调用express.json()express.urlencoded()将返回此类函数。

bxfogqkk

bxfogqkk2#

当你调用函数app.use()并传递一个函数调用作为它的参数(express.json())时,被调用的函数返回一些东西,这个返回值在后台应用到参数。
因此,当您调用app.use(express.json())时,实际上是在调用express.json(),它返回另一个函数(Express中间件)

2ul0zpep

2ul0zpep3#

如前所述,调用函数app.use()并传递一个函数调用作为其参数(express.json()),被调用的函数返回另一个函数。
我在我的应用程序中添加了一个对它的调用,我就能够步入该功能。
正如文档和代码所示,它是一个返回另一个函数的函数,在本例中,它是嵌入式的。

/**
 * Create a middleware to parse JSON bodies.
 *
 * @param {object} [options]
 * @return {function}
 * @public
 */

function json (options) {
  var opts = options || {}

  var limit = typeof opts.limit !== 'number'
    ? bytes.parse(opts.limit || '100kb')
    : opts.limit
  var inflate = opts.inflate !== false
  var reviver = opts.reviver
  var strict = opts.strict !== false
  var type = opts.type || 'application/json'
  var verify = opts.verify || false

  if (verify !== false && typeof verify !== 'function') {
    throw new TypeError('option verify must be function')
  }

  // create the appropriate type checking function
  var shouldParse = typeof type !== 'function'
    ? typeChecker(type)
    : type

  function parse (body) {
    if (body.length === 0) {
      // special-case empty json body, as it's a common client-side mistake
      // TODO: maybe make this configurable or part of "strict" option
      return {}
    }

    if (strict) {
      var first = firstchar(body)

      if (first !== '{' && first !== '[') {
        debug('strict violation')
        throw createStrictSyntaxError(body, first)
      }
    }

    try {
      debug('parse json')
      return JSON.parse(body, reviver)
    } catch (e) {
      throw normalizeJsonSyntaxError(e, {
        message: e.message,
        stack: e.stack
      })
    }
  }

  return function jsonParser (req, res, next) {
    if (req._body) {
      debug('body already parsed')
      next()
      return
    }

    req.body = req.body || {}

    // skip requests without bodies
    if (!typeis.hasBody(req)) {
      debug('skip empty body')
      next()
      return
    }

    debug('content-type %j', req.headers['content-type'])

    // determine if request should be parsed
    if (!shouldParse(req)) {
      debug('skip parsing')
      next()
      return
    }

    // assert charset per RFC 7159 sec 8.1
    var charset = getCharset(req) || 'utf-8'
    if (charset.slice(0, 4) !== 'utf-') {
      debug('invalid charset')
      next(createError(415, 'unsupported charset "' + charset.toUpperCase() + '"', {
        charset: charset,
        type: 'charset.unsupported'
      }))
      return
    }

    // read
    read(req, res, next, parse, debug, {
      encoding: charset,
      inflate: inflate,
      limit: limit,
      verify: verify
    })
  }
}

具体来说,这一行:

function json (options) {
    // ...
    return function jsonParser (req, res, next) { }
}

相关问题