尝试设置 Struct 的 属性 时出现 TypeError(Nashorn、Kafka Connect 转换器)

TypeError when trying to set a property of a Struct (Nashorn, Kafka Connect transformer)

使用 Kafka Connect (6.1.1),我尝试使用 Sergey34/kafka-connect-transformers 调整我的 Kafka 消息,然后再将它们放入 BigQuery(使用 BigQuerySink)。

在我的 connector.properties 中,我配置 ScriptEngineTransformer 如下(最小化示例):

transforms=scriptenginetransformer
transforms.scriptenginetransformer.type=seko.kafka.connect.transformer.script.ScriptEngineTransformer
transforms.scriptenginetransformer.scrip_engine_name=javascript
transforms.scriptenginetransformer.value.script=function valueTransform(source){ source.foo = 42; return source;}

但在运行时出现以下错误:

javax.script.ScriptException: TypeError: Cannot set property "foo" of Struct{a=111,b=222} in <eval> at line number 2

(堆栈跟踪 here

根据我对 JS 的初步理解,我认为应该可以替换结构或向结构添加属性,即,以下当然可以正常工作(在沙箱中):

function Foo(x, y) {
    this.x = x;
    this.y = y;
}

foo = new Foo(1, 2);
foo.y = 3;
foo.z = 4;

console.log(foo);

看起来我的 (Avro) Kafka 消息 ({a=111,b=222}) 已正确传递到 JS 脚本。那么这个错误意味着什么?

如果您需要添加一个静态字段,Kafka 带有一个内置的转换来做到这一点...

关于你的问题,阅读代码,它从不测试或使用具有模式的记录,也从不构建新的 Struct 类型

因此,我认为您的输入仅限于原始模式类型,例如 string/integer/boolean

换句话说,"Struct{a=111,b=222}" + "foo" 会“工作正常”,您最终会得到 "Struct{a=111,b=222}foo",但是 Avro 记录的字符串表示 "Struct{a=111,b=222}" 没有 Javascript 属性 foo, 所以不能设置

你的 alternative/workaround 将确保你正在使用标准的 JSONConverter,然后使用 JSON.parse 构建一个你可以将 JS 属性设置到的对象