我认为这不是节点或二进制解析器的问题。我认为这是我的理解。
const Parser = require("binary-parser").Parser;
const moment = require('moment');
let time = function(timestamp) {
return moment(timestamp, 'YYMMDDHHmmssSS').format('YYYY-MM-DD HH:mm:ss.SS');
};
let Telegram = new Parser()
.string('timestamp', {encoding: 'hex', length: 7, formatter: time});
例外是:
evalmachine.:9
return moment(timestamp, 'YYMMDDHHmmssSS').format('YYYY-MM-DD HH:mm:ss.SS');
^
ReferenceError: moment is not defined
at Parser. (evalmachine.:9:2)
...
我认为问题在于Parser不知道时刻。但我怎么能意识到这一点? 我试图直接在二进制解析器模块中导入时刻。但它不起作用。
如果我在Parser之外运行,那么它正在运行。
也许有人可以帮助我。
答案 0 :(得分:1)
formatter
函数在没有momentjs
上下文的情况下运行。我猜是因为它消耗formatter
属性的方式。在找到的代码here中,代码为:
if (this.code.formatter) {
... (ctx, varName, this.options.formatter)
由于this
关键字的funny方式有效,它会绑定到对象(options
)并且因为该声明不包含momentjs
,它说它没有定义。
通过查看第735
行:
ctx.pushCode("{0} = ({1}).call(this, {0});", varName, formatter);
它绑定到当前对象。
P.S。:我复制了代码并将其粘贴在Node.js上,并且它完美运行。 ^这是一个可能的解释。