Как запустить файл JS в Монго, используя источники
Я использую следующий код для запуска скрипта Монго в JS через данные Spring
ScriptOperations scriptOps = mongoOperation.scriptOps();
// Execute script directly
ExecutableMongoScript echoScript = new ExecutableMongoScript("function(x) { return x; }");
Object ob=scriptOps.execute(echoScript, "directly execute script");
System.out.println(ob);
// Register script and call it later
scriptOps.register(new NamedMongoScript("runjs", "D:\\GSTR3\\gstr3b.1.a.js"));
scriptOps.call("runjs", "execute script via name");
"EchoScript" запускается, но "runjs" выдает ошибку:
Caused by: com.mongodb.CommandFailureException: { "serverUsed" : "/10.144.113.138:27017" , "ok" : 0.0 , "errmsg" : "ReferenceError: runjs is not defined :\n_funcs1@:1:24\n" , "code" : 139 , "codeName" : "JSInterpreterFailure"}
at com.mongodb.CommandResult.getException(CommandResult.java:71)
at com.mongodb.CommandResult.throwOnError(CommandResult.java:110)
at com.mongodb.DB.eval(DB.java:358)
at org.springframework.data.mongodb.core.DefaultScriptOperations$2.doInDB(DefaultScriptOperations.java:119)
at org.springframework.data.mongodb.core.MongoTemplate.execute(MongoTemplate.java:446)
... 2 more
Но если я обычно запускаю скрипт с помощью node.js, я получаю результат:
D:\GSTR3>node gstr3b.1.a.js
{ Gstin: '27AIXPT3280A1Z2',
t_ival: 100003.78,
t_iamt: 0,
t_camt: 173520.1,
t_samt: 173527.69999999998,
t_itm_count: 33 }
D:\GSTR3>
1 ответ
scriptOps.register принимает ExecutableMongoScript в качестве аргумента, синтаксис: scriptOps.register(ExecutableMongoScript arg0) и NamedMongoScript принимает два аргумента, синтаксис: NamedMongoScript(имя строки, сценарий ExecutableMongoScript), он никогда не использует путь JavaScript.
Итак, что мы можем сделать, это запустить скрипт.js как java-процессор, дождаться его завершения и получить выходные данные из входного потока.
try{
String nodejsPath = "D:\\GSTR3\\gstr3b.1.a.js";
String cmd = "node " + nodejsPath;
Runtime run = Runtime.getRuntime();
Process pr = run.exec(cmd);
pr.waitFor();
} catch (InterruptedException ex) {
ex.printStackTrace();
}