问个node日志组件 morgan 的源码实现问题

这个组件源码本身不大,500多行。
打算学习下源码,不过遇到了个问题。
我抽取了主要的代码。代码如下:

function morgan(format, options) {
  var fmt = format
  var opts = options || {}

  var formatLine = typeof fmt !== 'function'
    ? getFormatFunction(fmt)
    : fmt

  return function logger() {

  }
}

function getFormatFunction (name) {
  // lookup format
  var fmt = morgan[name] || name || morgan.default

  // return compiled format
  return typeof fmt !== 'function'
    ? compile(fmt)
    : fmt
}

morgan.format('dev', function developmentFormatLine (tokens, req, res) {
  // get status color
  var color = 0

  // get colored function
  var fn = developmentFormatLine[color]

  if (!fn) {
    // compile
    fn = developmentFormatLine[color] = compile('\x1b[0m:method :url \x1b[' +
      color + 'm:status \x1b[0m:response-time ms - :res[content-length]\x1b[0m')
  }

  return fn(tokens, req, res)
})



function format(name, fmt) {
  morgan[name] = fmt
  return this
}

function compile (format) {
  if (typeof format !== 'string') {
    throw new TypeError('argument format must be a string')
  }

  var fmt = format.replace(/"/g, '\\"')
  var js = '  "use strict"\n  return "' + fmt.replace(/:([-\w]{2,})(?:\[([^\]]+)\])?/g, function (_, name, arg) {
    var tokenArguments = 'req, res'
    var tokenFunction = 'tokens[' + String(JSON.stringify(name)) + ']'

    if (arg !== undefined) {
      tokenArguments += ', ' + String(JSON.stringify(arg))
    }

    return '" +\n    (' + tokenFunction + '(' + tokenArguments + ') || "-") + "'
  }) + '"'

  // eslint-disable-next-line no-new-func
  return new Function('tokens, req, res', js)
}




morgan('dev')

然后运行后报错了
morgan.format is not a function

源码里我看到他先定义了个morgan方法,然后直接在下面调用morgan.format('combined',...)
确实有点不通,谁能帮忙看下 谢谢

阅读 2.2k
2 个回答

加上

morgan.format = format;
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题