怎么在 Java 后端执行 Node.js 代码并且返回结果给前端

2023-08-14 15:51:20 +08:00
 Jokerboozp

单位之前用的 Thingworx 物联网平台,里面有一个编写 Node.js 代码的编辑器,编辑之后可以直接运行显示结果。最近让我整体搬到新项目里面,说是前端没办法运行,要把 js 代码传给后端让后端运行。 里面有一些自定义的语法,我的想法是关键字匹配,如果匹配到关键字,就执行对应的操作,然后再把执行之后的结果和剩下的 js 拼接起来。 但是这样做的话就有点像一个 js 翻译器了,而且效率并不高。 我找了半天,实在没有好办法。各位大佬有没有好一点的解决方法。https://ice.frostsky.com/2023/08/14/3f6c0074202ec7d325673a21efe90f31.png

3172 次点击
所在节点    Java
44 条回复
biubiuGolang
2023-08-14 15:56:03 +08:00
GraalVM
gitignore
2023-08-14 16:00:52 +08:00
直接执行 shell 命令不行吗

```sh
node --eval="JavaScript 脚本"
```
brucedone
2023-08-14 16:00:53 +08:00
一般都是 node.js 封装成 http 服务,java 后端来调用,尽量别同进程跨解释器,会有一定的兼容问题。
mmdsun
2023-08-14 16:02:40 +08:00
Java 有 ScriptEngine 能执行一些简单的 js 代码,表达式之类的。
复杂的话,你用 Java 运行 node 命令,读取流返回结果也行吧?
pkoukk
2023-08-14 16:03:08 +08:00
如果只是简单的脚本的话,1# 的就可以
如果需要解析依赖,或者 import 标准库的话,可以搞个 node 服务,把编辑后的脚步发到那个服务去执行
mightybruce
2023-08-14 16:06:05 +08:00
如果是复杂的服务,还是通过服务调用服务的方式

简单的执行逻辑可以通过一些 js runtime 以及 js ast 解析来做。
virusdefender
2023-08-14 16:06:16 +08:00
runtime.getRuntime().exec 应该是最佳选择了
drvDPqg5nO7kZWhv
2023-08-14 16:07:43 +08:00
远程调用最省心吧
mightybruce
2023-08-14 16:09:27 +08:00
有一些 Java 实现的 JavaScript 引擎,可以直接被 java 调用,比如 Rhino 和 Nashorn
Jokerboozp
2023-08-14 16:13:59 +08:00
@biubiuGolang
@mmdsun
@mightybruce
javascript 引擎我试过,但是目前单位的 js 代码里会有一些例如“let dataInfo = Things["Localhost.PostgreSQL.Database.Thing"].Update({
updateString: sql /* STRING */
});”
这样的内容,中括号里面的内容是数据库中的,然后他有一个 Update 方法,参数是用户写的 sql ,我想要执行 js 的话还需要把这段代码执行,然后再把上面那段代码替换成 sql 的执行结果。
我觉得这样有点太不符合编码常理了
Jokerboozp
2023-08-14 16:15:28 +08:00
@brucedone 意思是用 Node.js 写一个 http 服务器,然后我把 js 代码直接发给 Node 服务器,接收服务器返回的结果,然后再转发给前端这样嘛
mightybruce
2023-08-14 16:18:14 +08:00
像这样的不是简单的 js 翻译,涉及到数据库驱动了, 不是表达式,正则,规则匹配引擎。你要么用 java 重写这部分逻辑,要么改装 node.js 变成 node.js 微服务调用 java 服务的形式。
Jokerboozp
2023-08-14 16:20:26 +08:00
@mightybruce 嗯嗯。就是涉及到的东西实在太多,我才有点不知所措。目前看来最优解貌似是写一个 Node 服务器,然后我用 Java 转发结果。
biubiuGolang
2023-08-14 17:18:59 +08:00
@pkoukk 复杂的也可以 import 标准和第三方都 ok
biubiuGolang
2023-08-14 17:20:25 +08:00
@Jokerboozp 了解一下 esprima 提取出来执行 sql
cl903254852
2023-08-14 17:26:04 +08:00
搞个 node 的服务,获取到编辑器的代码丢给 node 服务去执行,执行完通知 java ,java 把结果给前端。

java 就是个中间人,负责传话的
Jokerboozp
2023-08-14 17:32:06 +08:00
@cl903254852 两个问题:
1 、如果 Java 只是一个传话的,那为什么还需要 Java 嘞。直接让前端把 js 代码传给 node 服务器就可以了吗不是?
2 、js 里面会有“let dataInfo = Things["Localhost.PostgreSQL.Database.Thing"].Update({
updateString: sql /* STRING */
});”这样的代码,它需要连接数据库进行查询找到对应的 Update 具体是什么,我在 node 服务器里面应该怎么办呢?
Jokerboozp
2023-08-14 17:33:34 +08:00
@biubiuGolang 可以,我去研究研究
sofukwird
2023-08-14 17:33:37 +08:00
quickjs ?
Jokerboozp
2023-08-14 17:37:47 +08:00
@sofukwird 这个好像不可以,js 代码里会有连接数据库或者查找数据之类的操作

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/965163

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX