【问题标题】:javascript error in nifi executeScriptnifi executeScript中的javascript错误
【发布时间】:2018-08-15 00:57:31
【问题描述】:

我在获取执行脚本 nifi 进程的 javascript 脚本时遇到问题,希望能提供帮助。目标是传递一个包含 json 对象的流文件。我需要在不知道之前的内容/字段的情况下解析这个 json,并将其传递给流文件,该流文件被传递给下一个流程,即 MergeContent 并计算流文件的数量。 尝试测试脚本并得到以下错误:

 nifi.script.ExecuteScript - ExecuteScript[id=bd6842e9-e3a4-4d88-a59d- 
 7da1d74d109b] ExecuteScript[id=bd6842e9-e3a4-4d88-a59d-7da1d74d109b] 
 failed to process due to 
 org.apache.nifi.processor.exception.ProcessException: 
 javax.script.ScriptException: <eval>:21:17 Expected : but found value
         let value = json[key];
             ^ in <eval> at line number 21 at column number 17; rolling 
 back session: org.apache.nifi.processor.exception.ProcessException: 
 javax.script.ScriptException: <eval>:21:17 Expected : but found value

我对 javascript 不是很熟悉,因此非常感谢您的帮助。

flowFile = session.get();
if (flowFile != null) {

var StreamCallback = 
Java.type("org.apache.nifi.processor.io.StreamCallback");
var IOUtils = Java.type("org.apache.commons.io.IOUtils");
var StandardCharsets = Java.type("java.nio.charset.StandardCharsets");
var transformed_message = {};
var error = false;
var line = "ops_testQueue";

flowFile = session.write(flowFile, new StreamCallback(function 
  (inputStream, outputStream) {

    var content = IOUtils.toString(inputStream, 
  StandardCharsets.UTF_8); // message or content
    var message_content = {};
    try {
        message_content = JSON.parse(content);
        if(Array.isArray(message_content)){

    }
    Object.keys(message_content).forEach((key) => {
         var value = json[key];
         result.push(key + '=' + value);
         var jkey = "," +  "\"" + key + "\""  + '=' + value   
        });
    line = line + jkey +
            " value=" + "1"
            + " " + Date.now() * 1000000;


        // Write output content
        if (transformed_message) {
            outputStream.write(line.getBytes(StandardCharsets.UTF_8));
        }
    } catch (e) {
        error = true;
        outputStream.write(content.getBytes(StandardCharsets.UTF_8));
    }
 }));
 if (transformed_message.post_state) {
    flowFile = session.putAttribute(flowFile, "type", 
    transformed_message.type);
}

if (error) {
    session.transfer(flowFile, REL_FAILURE)
} else {
    session.transfer(flowFile, REL_SUCCESS)
}

}

编辑:

执行脚本的输入:

 {"pID":"1029409411108724738",
  "contentType":"text",
  "published":"2018-08-14 16:48:23Z",
  "crawled":"2018-08-14 12:48:33-04:00",
  "ID":"765"}

executeScript 的输出:

ops_testQueue,"ID"=765 value=1 1534265314969999870

我错过了什么吗?

【问题讨论】:

    标签: javascript apache-nifi


    【解决方案1】:

    我在这里看到了几件事:

    1. 我不知道 Nashorn(Java 的 JS 引擎)是否支持完整的 lambda 语法,我能够通过使 lambda 成为一个函数来使其工作 (见下面的脚本)。
    2. 您引用 json 变量从键中获取值,但我认为您想要 message_content
    3. result 没有定义,所以当你推送到它时会出错。

    这是你的脚本的编辑版本,我必须按照我认为你想要的方式工作(但如果我错了,请纠正我):

    flowFile = session.get();
    if (flowFile != null) {
    
    var StreamCallback = 
    Java.type("org.apache.nifi.processor.io.StreamCallback");
    var IOUtils = Java.type("org.apache.commons.io.IOUtils");
    var StandardCharsets = Java.type("java.nio.charset.StandardCharsets");
    var transformed_message = {};
    var error = false;
    var line = "ops_testQueue";
    
    flowFile = session.write(flowFile, new StreamCallback(function 
      (inputStream, outputStream) {
    
        var content = IOUtils.toString(inputStream, 
      StandardCharsets.UTF_8); // message or content
        var message_content = {};
        try {
            message_content = JSON.parse(content);
            if(Array.isArray(message_content)){
    
        }
        var jkey = "";
        Object.keys(message_content).forEach(function(key) {
             var value = message_content[key];
             //result.push(key + '=' + value);
             jkey = "," +  "\"" + key + "\""  + '=' + value   
            });
        line = line + jkey +
                " value=" + "1"
                + " " + Date.now() * 1000000;
    
            // Write output content
            if (transformed_message) {
                outputStream.write(line.getBytes(StandardCharsets.UTF_8));
            }
        } catch (e) {
            error = true;
            log.error(e);
            outputStream.write(content.getBytes(StandardCharsets.UTF_8));
        }
     }));
     if (transformed_message.post_state) {
        flowFile = session.putAttribute(flowFile, "type", 
        transformed_message.type);
    }
    
    if (error) {
        session.transfer(flowFile, REL_FAILURE)
    } else {
        session.transfer(flowFile, REL_SUCCESS)
    }
    }
    

    【讨论】:

    • @Mattyb...你是救生员。非常感谢您发现这些错误和您建议的更改。真的很感激。该脚本适用于您的测试人员。只需要将它应用到流文件进程,看看是否一切都以 Influx 结束。如果我有任何其他问题,可以 ping 你吗?
    • 当然!您还可以订阅 NiFi 的开发人员和/或用户邮件列表,这样其他人也可以提供答案/建议 :)
    • 不确定我是否应该开始一个新问题;但是上面脚本的输出并不包括所有的 json 字段,只有一个字段,value= 和 date。我将编辑帖子以包含示例 json 消息。
    • 您的jkey 变量不断被覆盖,向其中添加键/值的行应以jkey = jkey + ... 开头
    猜你喜欢
    • 1970-01-01
    • 2017-04-04
    • 2018-02-27
    • 2020-06-10
    • 1970-01-01
    • 2020-06-09
    • 2018-04-12
    • 1970-01-01
    • 2019-10-12
    相关资源
    最近更新 更多