这个组件源码本身不大,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',...)
确实有点不通,谁能帮忙看下 谢谢
加上