You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Node.js中调用Java类的getter方法并解决返回值undefined问题

问题解决步骤

第一步:修正Java代码的问题

你的Java代码存在两个关键问题,会导致输出不符合预期:

  1. 字符串比较不能用==,应该用equals()方法,否则无法正确匹配邮箱。
  2. 直接打印数组的toString()会输出对象哈希值,不是数组内容,需要用Arrays.toString()输出数组的实际内容。

修正后的Java代码:

import java.util.Arrays;

public class GetAyudas {
    public static String[] getter(String correo){
        if("pp@gmail.com".equals(correo)){
            return new String[]{"Sergio","Durán","Vega"};
        } else if("kk@upm.es".equals(correo)){
            return new String[]{"Ramón","Y","Cajal"};
        } else{
            return new String[]{"Nada","De","Nada"};
        }
    }
    public static void main(String[] args) {
        if(args.length == 0) {
            System.out.println(Arrays.toString(new String[]{}));
            return;
        }
        String[] result = getter(args[args.length-1]);
        System.out.println(Arrays.toString(result));
    }
}

先编译这个类:javac GetAyudas.java

第二步:修正Node.js代码的异步问题

spawn是异步操作,你的getAyudas函数没有返回任何值,所以res是undefined。需要用Promise封装异步逻辑,或者使用回调来获取结果。

方案一:使用Promise + async/await

const spawn = require("child_process").spawn;

function getAyudas(email) {
  return new Promise((resolve, reject) => {
    const worker = spawn("java", ["GetAyudas", email]);
    
    let output = "";
    worker.stdout.on("data", (data) => {
      output += data.toString();
    });

    worker.stderr.on("data", (err) => {
      reject(err.toString());
    });

    worker.on("close", () => {
      try {
        // 将Java输出的单引号数组转成JSON格式解析
        const result = JSON.parse(output.replaceAll("'", "\""));
        resolve(result);
      } catch (e) {
        reject(e);
      }
    });
  });
}

// 用async/await调用
(async () => {
  try {
    let res = await getAyudas("kk@upm.es");
    console.log(res);
    console.log(typeof res);
  } catch (err) {
    console.error("调用出错:", err);
  }
})();

方案二:使用回调函数

const spawn = require("child_process").spawn;

function getAyudas(email, callback) {
  const worker = spawn("java", ["GetAyudas", email]);
  
  let output = "";
  worker.stdout.on("data", (data) => {
    output += data.toString();
  });

  worker.stderr.on("data", (err) => {
    callback(err.toString(), null);
  });

  worker.on("close", () => {
    try {
      const result = JSON.parse(output.replaceAll("'", "\""));
      callback(null, result);
    } catch (e) {
      callback(e, null);
    }
  });
}

// 调用函数
getAyudas("kk@upm.es", (err, res) => {
  if (err) {
    console.error("调用出错:", err);
    return;
  }
  console.log(res);
  console.log(typeof res);
});

关键说明

  • Java输出的数组格式是['元素1', '元素2', ...],需要把单引号替换成双引号才能用JSON.parse解析成JS数组。
  • 必须监听stderr捕获Java运行时的错误,避免出现问题无法排查。
  • 异步操作无法同步返回结果,必须通过Promise或回调处理异步流程。

内容的提问来源于stack exchange,提问作者Sergio Durán Vega

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 03:18:24