我如何在一个二进制解析器格式化器中使用momentjs?

时间:2018-02-09 13:05:47

标签: node.js parsing binary node-modules

是的,请有人帮助我。我如何在格式化程序中使用时刻?

我认为这不是节点或二进制解析器的问题。我认为这是我的理解。

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之外运行,那么它正在运行。

也许有人可以帮助我。

1 个答案:

答案 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上,并且它完美运行。 ^这是一个可能的解释。