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

268 天前
 Jokerboozp

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

2809 次点击
所在节点    Java
44 条回复
biubiuGolang
268 天前
GraalVM
gitignore
268 天前
直接执行 shell 命令不行吗

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

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

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

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

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

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

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

© 2021 V2EX