groovy调用node执行js

尽意
2024-08-12 / 0 评论 / 101 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2024年08月13日,已超过255天没有更新,若内容或图片失效,请留言反馈。
目前好像没有更好的方案去实现在node环境下执行js,这种方案需要配合js代码,目标js只能为这个groovy服务

groovy代码

// Groovy script to execute Node.js script
static def runJsScript(String scriptPath, String argument) {
    // Create a command 
    def command = ["node", scriptPath, argument]

    // Create a ProcessBuilder with the command
    def processBuilder = new ProcessBuilder(command)

    // Start the process
    def process = processBuilder.start()

    // Capture the output of the process
    def output = new StringWriter()
    def error = new StringWriter()
    process.consumeProcessOutput(output, error)

    // Wait for the process to complete
    process.waitFor()

    // Return the output and error streams
    return [output.toString().trim(), error.toString().trim()]
}

// Path to the JavaScript file
def scriptPath = "./a.js"

// Argument to pass to the JavaScript function
def argument = "World"

// Call the JavaScript function
def (output, error) = runJsScript(scriptPath, argument)

if (error) {
    println "Error: $error"
} else {
    println "Output: $output"
}

js代码

function greet(name) {
    return `Hello, ${name}!`;
}

console.log(greet(process.argv[2]));

需要传参多少个参数,需要在js块拼接 process.argv[2] process.argv[3]

执行多个参数

groovy

static def runJsScript(String scriptPath, String... arguments) {
    def command = ["node", scriptPath]
    arguments.each {command.add(it)}
    def processBuilder = new ProcessBuilder(command)
    def process = processBuilder.start()
    def output = new StringWriter()
    def error = new StringWriter()
    process.consumeProcessOutput(output, error)
    process.waitFor()
    return [output.toString().trim(), error.toString().trim()]
}

js

function greet(name,value) {
    return `Hello, ${name}: ${value}`;
}
console.log(greet(process.argv[2],process.argv[3]));

其实还是有个小坑 传参json会被解析成js对象,就导致js拿到的数据已经是处理过的了,后面的流程是会受影响的。
解决方案:可以在添加额外参数时进行检验,判断当前字符串是否可以被转换为json对象,如果可以就做转义处理,str.replace('"','\"')

可以封装成一个工具类使用


class Execute {
    static def js(String scriptPath, String... arguments) {
        
        def command = ["node", scriptPath]
        // 如果是json格式,就进行转义,防止传参过程中被解析
        arguments.each {
            if (isValidJson(it)) {
                command.add(it.replace('"','\\""'))
            }else command.add(it)
        }
        def processBuilder = new ProcessBuilder(command)
        def process = processBuilder.start()

        def output = new StringWriter()
        def error = new StringWriter()
        process.consumeProcessOutput(output, error)

        process.waitFor()

        if (error!=null && (error as String) != ""){
            throw new Exception("js脚本出错:+$error")
        }

        return output.toString().trim()
    }

    // 判断字符串是不是json格式
    static private boolean isValidJson(String str) {
        def s = new JsonSlurper()
        try {
            s.parseText(str)
            return true
        } catch (Exception e) {
            return false
        }
    }
}
4

评论 (0)

取消