生成ID的服务器端和客户端的区别

4
如果我使用React/Vue/Angular或者只是用纯JS阻止我的页面在提交时加载,那么我应该在前端生成元素的id还是等待服务器响应后再生成id?以一个简单的todo列表为例,我添加一个todo,它必须有一个id,这样当我想要删除它时,我可以将id发送给服务器。过去,我通常会生成UUID并将其发送到服务器供其使用。我的问题只是这是否是良好的实践,或者我应该采取不同的方法?

1
由于id用于在数据库中唯一标识数据,因此您应始终在服务器端生成它们。另外,这个问题是基于个人观点的。 - Ariando
1
提交你的表单,将生成的ID作为响应体发送回来,等待它,然后更新你的列表。我不明白为什么你不能异步地完成这个任务。 - Ariando
2
这听起来像是一个有问题的策略。如果你只是为了客户端需求(例如未同步条目或React key的唯一标识)而需要,你仍然可以在客户端使用UUID,但它并不能替代数据库ID,只是因为使用UUID可能不方便而已。我应该提交表单并等待响应,然后再添加元素吗? - 不一定,出于可用性的考虑,你可以立即将其添加到DOM中,然后使用响应中收到的id更新元素,或者如果出现错误,则删除元素。 - Estus Flask
3
我不明白为什么管理员关闭了这个帖子,生成ID在客户端和服务器端都有实际的技术原因,这不是一个观点问题。 - lucaswxp
4
因此,你可能希望在客户端创建ID的正当理由。请注意,这仅适用于UUID,而不是顺序ID!等待服务器回复ID的缺点是,如果由于某种原因你发送了请求但没有收到响应(连接问题、服务器崩溃等),你将不得不重复请求,并冒着在服务器上重复工作的风险。如果你在客户端创建ID,这个问题就不存在了,因为你将使用相同的ID重复请求避免重复。这是一个小众的用例,但存在。 - lucaswxp
显示剩余2条评论
2个回答

2
如果您要将数据存储在服务器中,不应该在客户端创建元素的ID。您可能会添加相同的ID两次,或者另一个用户可能使用与您相同的ID,或者使用无效的ID,等等。您几乎可以肯定地避免重复的ID生成UUIDs客户端,但更容易、更安全的方法是在服务器上进行编辑。请注意,在客户端中,您无法控制客户端发送到后端的内容。无论您在JavaScript中做什么,恶意用户都可以始终黑客请求发送到服务器并以他们想要的方式修改它,因此您可能会得到太长的ID,超出了数据库字段的限制,或者有无效的值,神知道还有什么其他问题。

这部分就是为什么我提出这个问题的原因,让我感到困惑的主要是,如果我在服务器端生成ID,那岂不是意味着我必须等待服务器响应,这不就违背了不刷新页面的目的吗? - LukaM
不,你可以使用AJAX请求在不重新加载页面的情况下更新任何内容。如果你想允许用户在本地编辑列表,然后一次性提交所有更改,你可以(如果确实需要)为项目生成一个临时ID,但永远不要使用这样的ID将它们存储在数据库中。然而,我不明白为什么在这种情况下你需要一个ID,因为你将拥有对项目本身的引用,你不需要“按ID删除”,因为在这种情况下,项目尚未存在于数据库中。 - Oscar Paz
1
这并不适用于所有情况,请查看我对原帖的评论。 - lucaswxp

1
生成客户端ID确实是不好的做法,原因已经解释过了。但是我认为关于您担心的真正问题是,即使您在客户端生成了ID,您仍然需要等待服务器响应以确保资源实际上已创建。服务器可能暂时宕机,服务器-数据库连接可能中断,磁盘可能出现故障。在出现错误时,无论哪种情况都需要该响应才能获得更好的用户体验。因此,我不认为通过在客户端生成ID来改善整体用户体验。

1
这并不适用于所有情况,请查看我对原帖的评论。 - lucaswxp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接