【问题标题】:Generating Id's Server vs Client side [closed]生成ID的服务器与客户端[关闭]
【发布时间】:2020-01-29 11:23:40
【问题描述】:

如果我使用 React/Vue/Angular 之类的东西,或者只是阻止我的页面在使用纯 JS 提交时加载,我应该在前端为我的元素生成 id 还是应该等待服务器响应有身份证?

一个简单的例子是旧的待办事项列表,我添加了一个待办事项,它必须有一个 id,所以当我想删除它时,我可以将 id 发送到服务器。过去,我曾经生成一个 UUID 并将其发送到服务器以供其使用。我的问题是这是否是一种好的做法,还是我应该采取不同的做法?

【问题讨论】:

  • 由于 id 用于唯一标识数据库中的数据,因此您应该始终在服务器端生成它们。此外,这个问题是基于意见的。
  • @PrestonGarvey 是的,我知道它们应该是独一无二的,而且在服务器端生成它们对我来说更安全,但我要问的是我是否正在提交一些东西并将其发送到服务器将其存储在我的数据库中,但不想刷新我的整个页面并通过使用 javascript 推送到我的数组来添加它,如果我想删除它,我还需要稍后发送 id。我应该提交我的表单并等待响应然后添加元素吗?这难道不是违背了不刷新我的页面的全部目的吗?
  • 这听起来像是错误的策略。如果您需要纯粹用于客户端需求(例如,未同步条目的唯一 ID 或 React key),您仍然可以在客户端使用 UUID,但它不能替代数据库 ID,只是因为使用 UUID 可能不方便为了那个原因。 我应该提交我的表单并等待响应然后添加元素吗? - 不一定,出于可用性原因,您可以立即将其添加到 DOM,然后使用收到的ids 更新元素响应,如果出现错误则删除元素。
  • 我不明白为什么版主关闭了这个,在客户端和服务器端生成ID有实际的技术原因,不是见仁见智的问题。
  • 因此,您可能想在客户端上创建 ID 是有正当理由的。注意这仅对 UUID 有效,对顺序 ID 无效!等待服务器回复 ID 的缺点是,如果由于某种原因您发送了请求,但没有收到回复(连接问题、服务器崩溃等),您将不得不重复请求并冒着在服务器上重复工作的风险。如果您在客户端创建 ID,这个问题就会消失,因为您将使用相同的 ID 重复请求,从而避免重复。这是一个小众用例,但它确实存在。

标签: javascript node.js reactjs vue.js client-server


【解决方案1】:

如果您要将数据存储在服务器中,则永远不应在客户端中创建元素的 ID。您可以添加两次相同的 ID,或者另一个用户可以使用与您相同的 ID,或者使用无效的 ID,或者 - 您明白了。您几乎可以肯定地避免在客户端重复生成 UUID 的 IDS,但在服务器中编辑它们更容易、更安全。考虑到在客户端中,您无法控制客户端向后端发送的内容。不管你用 JavaScript 做什么,恶意用户总是可以破解发送到服务器的请求并按照他们想要的方式修改它,所以你可能会以对你的数据库字段来说太长的 ID 结束,或者以无效的值,或者上帝知道还有什么.

【讨论】:

  • 这部分是我问这个问题的原因,主要让我感到困惑的是,如果我在服务器端生成 id 并不意味着我将不得不等待服务器做出响应,这是否违背了不刷新页面的目的?
  • 不,您可以使用 AJAX 请求来更新任何内容,而无需重新加载页面。如果您想允许用户在本地编辑列表,然后在单个请求中提交所有更改,您可以(如果您确实需要它)为项目生成一个临时 ID,但不要使用该 ID 将它们存储在数据库。但是,我不明白为什么在这种情况下您需要一个 ID,因为您将引用项目本身,您不需要“按 ID 删除”,因为在这种情况下,项目不会还没有进入数据库。
  • 并非所有情况都如此,请查看我对 OP 的评论。
【解决方案2】:

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

【讨论】:

  • 并非所有情况都如此,请查看我对 OP 的评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-22
  • 1970-01-01
  • 2015-04-17
  • 2010-09-19
  • 1970-01-01
  • 2011-11-16
  • 2011-01-19
相关资源
最近更新 更多