gpt4 book ai didi

javascript - 如何在 node.js 中将数组作为参数传递给 jar exec

转载 作者:行者123 更新时间:2023-11-30 19:36:03 25 4
gpt4 key购买 nike

我有 2 个查询,第一个查询从我的工作表中收集数据,第二个查询从我的车辆表中收集数据,然后两个数据都存储在结果数组中。如何将此结果数组作为 jar 执行的参数传递到我的子进程中? jar 执行中的参数是否有任何大小限制,因为我的工作表和车辆表中有很多数据。如果参数有大小限制,运行具有大参数大小的 jar 文件的最佳方法是什么?

var express = require('express');
var router = express.Router();

router.post('/', async function(req, res, next) {

var date = req.param('date');
var joblist;
var vehiclelist;

var promises = [];
promises.push(query1(date));
promises.push(query2());

var results = await Promise.all(promises);
console.log(results[0]); // query1
console.log(results[1]); // query2

function query1(date) {
return new Promise((resolve, reject) => {
res.locals.connection.query('SELECT * FROM job WHERE date = ?',[date] , function (error, results, fields) {
if (error) {
reject(error);
} else {
resolve(results);
}
});
});
}

function query2() {
return new Promise((resolve, reject) => {
res.locals.connection.query('SELECT * FROM vehicle' , function (error, results, fields) {
if (error) {
reject(error);
} else {
resolve(results);
}
});
});
}

var exec = require('child_process').exec, child;
child = exec('java -jar /home/java/testsize.jar',
function (error, stdout, stderr){
console.log('stdout: ' + JSON.stringify(stdout));
//console.log('stderr: ' + stderr);
res.send(joblist+" "+stderr);
if(error !== null){
console.log('exec error: ' + error);
}
});

});

module.exports = router;

最佳答案

我假设 jar 文件不包含命令行参数。

在 java 中传递命令行参数的语法是:java -jar javafilename arg1 arg2 ....

所以在你的代码中传递命令行参数:

/*variable 'store the results of two array in string'*/
const cmdArgs = [...results[0], results[1]].toString().replace(/[, ]+/g, " ");
/* variable 'command line code' */
const cmdCode = `java -jar /home/java/testsize.jar ${cmdArgs}`;
var exec = require('child_process').exec, child;
child = exec(cmdCode,
function (error, stdout, stderr){
console.log('stdout: ' + JSON.stringify(stdout));
//console.log('stderr: ' + stderr);
res.send(joblist+" "+stderr);
if(error !== null){
console.log('exec error: ' + error);
}
});

如果 jar 文件接受结果作为输入,您可以简单地通过管道“|”传递它们。

例子:

/*variable 'store the results to two array in string'*/
const cmdArgs = [...results[0], results[1]].toString().replace(/[, ]+/g, " ");
/* variable 'command line code' */
const cmdCode = `${cmdArgs} | java -jar /home/java/testsize.jar `;
var exec = require('child_process').exec, child;
child = exec(cmdCode,
function (error, stdout, stderr){
console.log('stdout: ' + JSON.stringify(stdout));
//console.log('stderr: ' + stderr);
res.send(joblist+" "+stderr);
if(error !== null){
console.log('exec error: ' + error);
}
});

至于参数的大小限制

没有找到任何相关信息,但是,不同的操作系统有最大命令行长度限制。

如果参数的大小足够大,超过命令行长度限制,你可以去java的输入流接受数据作为输入(需要更改代码java(jar文件)代码)接受数据输入)。

您可以将结果存储在临时文件中,然后通过管道将它们传递给 jar。

例子:

/*require fs to write into file*/
var fs = require("fs");

/*variable 'store the results to two array in string'*/
const cmdArgs = [...results[0], results[1]].toString().replace(/[, ]+/g, " ");
/*set file name*/
const tempFile = 'temp' + new Date().valueOf() + '.txt';
fs.writeFileSync(tempFile, cmdArgs);
/* variable 'command line code' */
const cmdCode = `cat > ${tempFile} | java -jar /home/java/testsize.jar `;
var exec = require('child_process').exec, child;
child = exec(cmdCode,
function (error, stdout, stderr){
/*delete the file*/
fs.unlinkSync(tempFile);
console.log('stdout: ' + JSON.stringify(stdout));
//console.log('stderr: ' + stderr);
res.send(joblist+" "+stderr);
if(error !== null){
console.log('exec error: ' + error);
}
});

关于javascript - 如何在 node.js 中将数组作为参数传递给 jar exec,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55945287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com