Sly 发表于 2025-7-7 10:14

前端JS代码如何操作后端程序产生的对象?

本帖最后由 Sly 于 2025-7-7 10:55 编辑

朋友让帮忙问的问题+他刚发来的修改:
这里对象指的是不仅有数据字段,还有各种方法、包括对其他对象的引用的不可序列化对象。
因此存在2个问题:

1. 对象生命周期短:前后端每次连接中,后端产生的所有对象似乎都会在连接完成后被销毁。
虽然可考虑一些持久化方案,但这似乎只对单纯存储数据的对象适用。

2. 通信接口是非面向对象的:典型的HTTP方式中后端暴漏的接口完全就是一个个独立的方法,导致其丧失了面向对象的特性,造成写个代理模式的方法也无法方便操作。

这也就共同体现在前端无法操作后端的对象,只能使用传参一些数据、返回一些数据的方式。

好像主流框架,甚至主流平台体系完全不赞同这个做法。
方案一似乎可以用WebSocket方式解决,方案二毫无办法。

补充场合:
1、不需要大并发,不需要负载均衡
2、后端是内存安全平台,大概率他们就是Java那一套

补充用途:
1、该软件不是一个面向数据库开发的业务软件,只有少量数据需要存储。持久化数据不是程序关键;
2、也不是一个需要用户安全认证的软件,没有登录、更不需要RBAC;
3、该软件就是为了多人可以同时使用某个计算模型,并共享少量数据,而且为了方便使用采用的浏览器内运行的方式。
本质是将一个单机桌面软件拆分成服务端+客户端。后端产生的复杂业务对象,和当时桌面程序一样,可以直接无保留的供前端灵活使用。或者说改为Web程序也想这样,此时用Vue重写老WPF行了,同时可以减少对后端代码的修改。

dcl2009 发表于 2025-7-7 10:20

安全原因呗,只要牵扯到指针,那必然会引起泄露,只要泄露那就可以干任何事情。

xy. 发表于 2025-7-7 10:23

传指针和 vtable 就行了

xy. 发表于 2025-7-7 10:23

朋友让帮忙问的问题
你说的这个朋友是不是你自己. 写过 200 行以上任何代码的人, 不会问出这种问题.

Sly 发表于 2025-7-7 10:25

本帖最后由 Sly 于 2025-7-7 10:27 编辑

xy. 发表于 2025-7-7 10:23
你说的这个朋友是不是你自己. 写过 200 行以上任何代码的人, 不会问出这种问题. ...

不是,我并不搞这种我觉得无聊的行业。
因为搞这种行业的人普遍更加有个凸显的特点,就是觉得别人都是傻逼,只有自己最牛逼。

xy. 发表于 2025-7-7 10:27

Sly 发表于 2025-7-7 10:25
不是,我并不搞这种我觉得无聊的行业。
因为搞这种行业的人普遍更加有个凸显的特点,就是觉得别人都是傻 ...

后半句不一定. 前半句还真是. 你问的这个还真就是纯啥比问题.

mawer111 发表于 2025-7-7 10:34

你是经常被人当作傻逼吧,能问出这种问题也正常

Sly 发表于 2025-7-7 10:35

本帖最后由 Sly 于 2025-7-7 10:37 编辑

mawer111 发表于 2025-7-7 10:34
你是经常被人当作傻逼吧,能问出这种问题也正常

我不清楚这个问题具体想表达什么,我只是转发。
但是你的言论似乎更加凸显和证明了,果然那个行业就是互相认为是傻逼

casc 发表于 2025-7-7 10:44

描述不清楚 功能不明确 打回重写
功能点都不清楚要干什么 怎么能解决问题

Sly 发表于 2025-7-7 10:44

本帖最后由 Sly 于 2025-7-7 10:59 编辑

casc 发表于 2025-7-7 10:44
描述不清楚 功能不明确 打回重写
功能点都不清楚要干什么 怎么能解决问题 ...

我让他补充一下

更新:他发来了。

sagnitude 发表于 2025-7-7 10:48

问题都描述不清楚,一直在纠结各种概念和定义,牛头不对马嘴

而且无论何种情况,把后端数据直接暴露出来修改都是应该严禁的,因为前端没有安全性可言

如果真想改,有个终极解决方案,直接装一个数据库编辑网页,比如phpMyAdmin,想怎么改后端怎么改

a351801682 发表于 2025-7-7 10:55

上GraphQL接口,自己爱怎么折腾怎么折腾。

Sly 发表于 2025-7-7 10:57

本帖最后由 Sly 于 2025-7-7 11:10 编辑

sagnitude 发表于 2025-7-7 10:48
问题都描述不清楚,一直在纠结各种概念和定义,牛头不对马嘴

而且无论何种情况,把后端数据直接暴露出来修 ...

他补充了

他们这个软件就是单机桌面版软件改的,自己小组用,不需要安全性(登录这个功能都没有。前端可以随便修改甚至破坏后端的东西——虽然这么做没有必要),可用性和低成本的改造是更需要。

有个我自己发现的问题,好像不止一个人强调安全性,从2楼开始就强调。难道所有场合和用途的Web程序都必须讲安全性么?桌面程序讲了么,如果讲了哪来那么多内存修改器。所以如果本就是单机或者少量固定人用的Web程序,而且还不是数据库相关的,需要非得强调各种安全么?非故意情况下不出现运行bug不就行了么

lwmq 发表于 2025-7-7 11:09

本帖最后由 lwmq 于 2025-7-7 11:13 编辑

我想了半天也没搞明白啥意思,web前端想调用后台对象无论如何不也是要通过http接口吗?
后台对象序列化给前端调用是什么鬼
-------------
想操作同一个对象把对象仍在web服务的内存里,前端传调用方法的参数不也就可以了吗?
有问题不去csdn查跑来chh问也是挺奇怪了
------------
话说都想到websocket了不如考虑一下jmx?反正都不是什么正经解决方案

forfans 发表于 2025-7-7 11:15

既然这样,还搞什么前后端分离。。。

sagnitude 发表于 2025-7-7 11:19

Sly 发表于 2025-7-7 10:57
他补充了

他们这个软件就是单机桌面版软件改的,自己小组用,不需要安全性(登录这个功能都没有。前端可 ...

因为如果是正经软件,安全性这样子过不了验收,上线会出大事

即使是内部工具,也没法保证出问题之后可以追责

比如去年字节有个实习生直接改了线上训练的模型,哪怕是内部使用的工具,也不能没有安全性,也不能不讲操作审计

https://baike.baidu.com/item/2024%E5%B9%B4%E5%AD%97%E8%8A%82%E8%B7%B3%E5%8A%A8%E5%A4%A7%E6%A8%A1%E5%9E%8B%E8%AE%AD%E7%BB%83%E8%A2%AB%E5%AE%9E%E4%B9%A0%E7%94%9F%E6%94%BB%E5%87%BB%E4%BA%8B%E4%BB%B6/65011613?fr=aladdin

如果是自己用的,那这样回复,
1. 如果你用的后端语言支持 eval 这种万能灵药,直接前端写脚本后端执行
2. 数据是存在数据库,或者redis,用web客户端修改,数据库本来就是用来共享数据方便多人修改的
3. 如果后端支持在线编译或者在线替换 (hot load),比如java,c,自己做个方法执行下,做个rpc
4. 把后端直接暴露出来,如jmx
5. 除此之外你想修改数据,就必须每一个需求都写独立接口

针对此需求,数据库本来就是用来共享数据方便多人修改的,你不用数据库就是给自己加难度

lwmq 发表于 2025-7-7 11:24

sagnitude 发表于 2025-7-7 11:19
因为如果是正经软件,安全性这样子过不了验收,上线会出大事

即使是内部工具,也没法保证出问题之后可以 ...

我是没想明白对应后端功能暴露一个接口给前端调用有什么麻烦的……
折腾了半天简直是脱了屁放裤子,哪怕前端传个方法名后端直接if else去调用都没这么多屁事

Sly 发表于 2025-7-7 11:24

lwmq 发表于 2025-7-7 11:09
我想了半天也没搞明白啥意思,web前端想调用后台对象无论如何不也是要通过http接口吗?
后台对象序列化给前 ...

他回复:

前端难以保持对后端某个对象的引用,难以快速的定位到某个对象,并且调用方法传入参数也可能涉及其他对象。
目前正在研究的一个办法是是后端维持一个对象哈希表,把key作为句柄的思路传递给前端,供前端未来调用和作为参数传入。然后用反射的思路把方法都暴漏给前端。

Sly 发表于 2025-7-7 11:24

forfans 发表于 2025-7-7 11:15
既然这样,还搞什么前后端分离。。。

因为还得多人使用

Sly 发表于 2025-7-7 11:25

本帖最后由 Sly 于 2025-7-7 11:39 编辑

sagnitude 发表于 2025-7-7 11:19
因为如果是正经软件,安全性这样子过不了验收,上线会出大事

即使是内部工具,也没法保证出问题之后可以 ...

追责的问题暂不存在,这就和服务器上有个台账excel大家都能编辑。当然确实存在一个人故意搞破坏删除的可能性,但为了方便可以不至于非得加上一些安全验证。程序的目的是为了大家方便共同操作计算和分享分析结果。数据安全不是矛盾。

其他的已经转发他了,谢谢你的回复。

lwmq 发表于 2025-7-7 11:27

Sly 发表于 2025-7-7 11:24
他回复:

前端难以保持对后端某个对象的引用,难以快速的定位到某个对象,并且调用方法传入参数也可能涉 ...

说了半天就是想让对象常驻内存然后保证同一个用户反复使用啊……
那办法不是多了去了……

Sly 发表于 2025-7-7 11:28

lwmq 发表于 2025-7-7 11:27
说了半天就是想让对象常驻内存然后保证同一个用户反复使用啊……
那办法不是多了去了…… ...

不是同一个用户,可以给多个用户(客户端浏览器)调用。

lwmq 发表于 2025-7-7 11:48

Sly 发表于 2025-7-7 11:28
不是同一个用户,可以给多个用户(客户端浏览器)调用。

你说的就是我说的意思

Sly 发表于 2025-7-7 12:03

lwmq 发表于 2025-7-7 11:48
你说的就是我说的意思

可能还有的区别在于这个对象也还可以被其他客户端也调用

不是说某个对象固定隶属于某个客户端

moresun23 发表于 2025-7-7 13:16

问错地方了 问对了的地方 你会被吐槽的更臭。。。

Sly 发表于 2025-7-7 13:37

本帖最后由 Sly 于 2025-7-7 13:47 编辑

moresun23 发表于 2025-7-7 13:16
问错地方了 问对了的地方 你会被吐槽的更臭。。。

我也发现了,无论什么情况和前提,他们在某个时期内只认可这个时期的主流解决方案,其他都是异端。

smallanntse 发表于 2025-7-7 13:49

后端用数据库也没有问题啊,比如像sap这种,内存数据库,速度不慢啊,

sagnitude 发表于 2025-7-7 14:08

如果只是所有人实时查看和控制服务器上的一堆会变的数据,然后可以接受一些修改命令,这些数据本身都是一些简单的参数和计算结果

后端把各类数据都生成一个句柄,对所有数据的读写操作包装一层,把句柄和接受的操作以及参数存到数据库里

前端读:用MQ监听变化(MQTT,etc),实时显示
前端写:把 句柄+参数+操作 包装成一个命令,发到MQ队列里
后端读:监听对象变化,或者每1秒广播一次所有数据的句柄和状态
后端写:监听命令队列,根据命令对数据依次进行操作



其实说到底就是一个腾讯文档

Sly 发表于 2025-7-7 14:22

smallanntse 发表于 2025-7-7 13:49
后端用数据库也没有问题啊,比如像sap这种,内存数据库,速度不慢啊,

因为大部分内存数据库也只能保存数据,或者说对象需要是可序列化的。

对象中的其他引用就没了。

Sly 发表于 2025-7-7 14:25

本帖最后由 Sly 于 2025-7-7 14:28 编辑

sagnitude 发表于 2025-7-7 14:08
如果只是所有人实时查看和控制服务器上的一堆会变的数据,然后可以接受一些修改命令,这些数据本身都是一些 ...

嗯嗯,目前确实是这个思路

只不过对象的某个方法里面的某个参数也有可能是其他对象,对象和对象之间是有关系的。

所以打算对象的引用在前端就用句柄代替。
后端维护一个哈希表,每生成一个对象就生成一个句柄作为key传给客户端。客户端用句柄来索引到对象,并且调用方法整个过程依靠反射来实现,反射也全部暴漏给前端。
方法如果需要的某个对象作为参数,也用句柄作为参数来代替对象的引用,后端在反射的相关代码里面再查表反转过来。

页: [1] 2
查看完整版本: 前端JS代码如何操作后端程序产生的对象?