如何在Node.js中调用Java类的getter方法并解决返回值undefined问题
问题解决步骤
第一步:修正Java代码的问题
你的Java代码存在两个关键问题,会导致输出不符合预期:
- 字符串比较不能用
==,应该用equals()方法,否则无法正确匹配邮箱。 - 直接打印数组的
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
相关产品推荐
相关产品推荐

