在完成 API Nodejs 之前提示用户警告
Posted
技术标签:
【中文标题】在完成 API Nodejs 之前提示用户警告【英文标题】:Prompt user a warning before completing a API Nodejs 【发布时间】:2016-11-08 01:37:07 【问题描述】:这是用例:
用户调用 API。 API 发现它正在覆盖某些内容 之前保存的。为了取得成功并完成,用户需要说'是的,去 提前并覆盖”或“不,不要覆盖”。所以基本上需要一个方法 发回响应并获取用户选择的请求和 然后继续操作。
我的担忧是:
这样做的最佳做法是什么? 如果我暂停服务并根据需要返回响应。用户输入选项后,我是否需要触发相同的 API?我正在使用 Nodejs/Express 和 Angularjs。
【问题讨论】:
【参考方案1】:每个 API 请求都应该是无状态的。为此,您向 API 添加一个选项,该选项指示服务器在发生覆盖时应该做什么。客户端可以指定如果存在则覆盖或不覆盖并返回数据已经存在的状态。
然后由客户端决定是否会提示用户并进行第二次 API 调用请求覆盖。这是客户端行为,而不是服务器策略。
如果客户端首先发送don't overwite
,然后在提示后进行第二次 API 调用要求覆盖,那么服务器可能不得不从头开始重新运行 API 调用。是否可以从第一个请求中临时缓存任何内容以提高第二个请求的性能是特定于实现的。这是服务器上的一种实现选择,与任何其他提高性能的缓存相同。
【讨论】:
我就是这样做的。没有“覆盖”标志但实际上是覆盖的请求返回 405,客户端将其解释为“必须已经存在数据,需要要求用户显式覆盖”。【参考方案2】:正如上面提到的@jfriend00,REST api 应该是无状态的。但是你可以通过你的后端 nodeJs 代码来实现这一点。实际上这是一种状态的幻觉,但事实并非如此。
所以你会有两个端点像
/data/verify
这只会检查数据是否存在于数据库中并向 UI 发送 true 或 false
/data/add
现在,如果用户想要覆盖并单击 UI 上的“覆盖”按钮或其他内容,请向此端点发送请求,该请求将覆盖数据。
如果用户不想覆盖,请不要调用添加端点。
【讨论】:
这个问题是其他人可能在验证和添加之间添加了数据。在这种情况下,添加端点仍然需要正确运行,而不仅仅是假设如果它被调用,那么应该覆盖其中的任何内容。另请参阅 ***.com/questions/38216592/… 关于建议此问题的其他答案。 好点。可能在验证 api 中,可以在数据中设置一个标志,将数据锁定一段时间?随后的验证调用只会检查 lockState 并在其锁定时退出。这样,可以避免竞争条件。 那么...有状态?而不仅仅是它的错觉。这会起作用,但它不是很 RESTful!/data/verify
受竞争条件的影响,因为在返回结果和客户端根据它做出某些决定之间,数据可能会发生变化。这与不推荐使用 fs.existsSync(path)
的原因相同。在不受竞争条件限制的情况下,没有安全的方法可以使用它。相反,您告诉服务器您要执行的操作,如果数据已经存在,您告诉它要做什么,然后服务器可以执行原子检查和操作。除非你有状态锁,否则只有服务器可以实现原子操作。【参考方案3】:
如果您只想开发 API,那么您可以:
创建另一个API来检查数据是否存在;然后
与用户确认后继续API
或:
在 API 中创建另一个标志,如“canOverwrite”,并在调用 API 之前与用户确认是否可以覆盖数据(如果存在)。
使用 websockets 代替 HTTP 调用还可以让您灵活地发出确认(但可能不适用于 AngularJS)。
【讨论】:
检查数据是否存在于一个 API 调用中,然后在客户端根据该数据做出决定是一种竞争条件。检查然后应用覆盖逻辑需要是服务器上的原子操作,以避免与其他一些 API 请求更改数据是否存在的竞争条件。 @j_k 就像在下面的 ans 中指出的那样。如果verify API和操作api之间有数据变化怎么办 如果 API 处理事务数据,您需要有一个与验证 api 和更新 Pai 相关联的时间戳 @SiddharthSrivastva,当您读取数据时,您还必须获取数据的时间戳(lastupdatedTime)。这需要在您验证数据时使用。如果数据被其他用户修改,则通过验证 API 传递的时间戳与表中的时间戳将不匹配。 @j_k 让我测试一下。会尽快通知您以上是关于在完成 API Nodejs 之前提示用户警告的主要内容,如果未能解决你的问题,请参考以下文章