我如何在“二进制解析器”格式化程序中使用“momentjs”?

How can i use ‚momentjs‘ in a ‚binary-parser‘ formatter?

谁能帮帮我。我如何在格式化程序中使用 moment?

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

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)
...

我认为问题是解析器不知道时刻。但我怎么能意识到呢? 我试图直接在二进制解析器模块中导入时刻。但它不起作用。

如果我 运行 片刻在解析器之外,那么它正在工作。

也许有人可以帮助我。

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 上,它运行良好。 ^这是一个可能的解释。