怎么在 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

3334 次点击
所在节点    Java
44 条回复
shyangs
2023-08-14 17:48:00 +08:00
把 Java 寫的後端扔了,改用 Node.js 寫後端。
cl903254852
2023-08-14 17:55:29 +08:00
@Jokerboozp 因为你是执行 node 代码,那肯定 node 环境是最稳妥的。 我的意思是,node 服务只针对你这个编辑器的场景即可,项目其他该用 java 用 java 。node 既然是服务端肯定能连数据库
des
2023-08-14 18:04:21 +08:00
换 Nodejs 来搞吧,感觉其实都差不多,都要写 Things 相关的驱动
不过我有点好奇,你这 12 行怎么是个同步操作?
des
2023-08-14 18:09:06 +08:00
不建议提取 SQL 来执行,你这前端是个编辑器,鬼知道前端会传什么东西过来

用 javascript 引擎来做也行,前提也是你得补足“ Things["Localhost.PostgreSQL.Database.Thing"] ” 相关的东西
wganbleuthall
2023-08-14 18:10:10 +08:00
包装成一个 http 服务吧
WispZhan
2023-08-14 20:06:44 +08:00
lisongeee
2023-08-14 20:21:43 +08:00
可以使用 webcontainer 直接在浏览器运行一个小型的 linux nodejs 进程

https://webcontainers.io/guides/quickstart

它由 https://stackblitz.com/ 开发,现在很多文档/问题讨论上的在线 demo 都是基于这个
lisongeee
2023-08-14 20:25:28 +08:00
艹,你们这个还要连接数据库?那看起来是一个阉割版的远程 nodejs console ,那只能用 远程 nodejs 去执行了
zhuangzhuang1988
2023-08-14 20:31:53 +08:00
包装个 grpc?
cbdyzj
2023-08-14 20:59:35 +08:00
kid1412621
2023-08-14 21:12:44 +08:00
graal
Jokerboozp
2023-08-14 21:19:28 +08:00
@zhuangzhuang1988 grpc 我还没学明白,有点难度。哈哈哈哈哈哈
Jokerboozp
2023-08-14 21:21:45 +08:00
@lisongeee 就是因为要连数据库,然后还有一堆自定义的语法,所以我才头大。看了各位大佬的回复看来只有写一个 node 服务才行了
Jokerboozp
2023-08-14 21:28:14 +08:00
@cl903254852 明白了明白了,多谢大佬
musi
2023-08-14 22:19:19 +08:00
看了一圈回复都没说到点子上,你这只需要实现 ecma262 规范的引擎也可以认为是 js 引擎基本上就可以执行代码了,你的自定义语法无非是 Thing 这个对象,那你在执行代码的时候提前去定义这个对象就好了,就你给出的代码来说,中括号是属性获取语法,其实就是在获取 Thing 对象的 Localhost.PostgreSQL.Database.Thing 属性,可以用 proxy 语法拦截 getter ,获取到这个 key ,然后是.update ,也就是 Thing 对象的 Localhost.PostgreSQL.Database.Thing 属性值是个对象,对象里面有个 update 方法,你再实现一下就行。
musi
2023-08-14 22:21:01 +08:00
另外就这个代码来说,只要做好鉴权前端是完全可以执行的
Jokerboozp
2023-08-14 22:32:36 +08:00
@musi 但是我给出的这个是其中一个的代码,还有其他的 Thing 对象的属性,是由用户自定义来写的,每个属性有哪些方法也是用户自定义来写的。如果按照您说的这样,每一个属性我都实现方法的话,感觉不太能实现诶。刚开始写的时候我是用 jvm 的 js 引擎来写的,我觉得应对这种情况不太可行。
musi
2023-08-14 22:35:09 +08:00
@Jokerboozp 你还是没理解,属性不管是谁定义它只要定义了就行,平台方和用户方无所谓,你只需要封装特定的 sdk 就行
musi
2023-08-14 22:42:56 +08:00
@Jokerboozp 你中括号里面的内容,完全是语义化的,host.数据库类型.Datebase.表名,你用 proxy 拦截到 key 时就去找对应的数据库就行了,这也不是说一个属性定义一个方法,完全就是一个通用的方法
Jokerboozp
2023-08-14 22:48:33 +08:00
@musi 不是的,他有的会写成 Things[thing]这样,这里面不一定是数据库,可能是另一个方法集合的名字,然后他又用里面的某一个方法

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

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

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

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

© 2021 V2EX