Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 在完成API节点之前提示用户警告_Angularjs_Node.js_Express_Api Design - Fatal编程技术网

Angularjs 在完成API节点之前提示用户警告

Angularjs 在完成API节点之前提示用户警告,angularjs,node.js,express,api-design,Angularjs,Node.js,Express,Api Design,以下是用例: 用户调用API。API发现它正在覆盖某些内容 以前保存的。要取得成功,用户需要说“是的,开始” “前进并覆盖”或“否,不覆盖”。所以基本上需要一种方法 返回响应并获取用户选择的请求,以及 然后继续操作 我关注的是: 这样做的最佳实践是什么 如果我暂停服务并根据需要返回回复。我是否需要在用户输入选项后启动相同的API 我正在使用Nodejs/Express和Angularjs。如果您只想开发API,那么您可以: 创建另一个API检查数据是否存在;然后 与用户确认后继续API 或:

以下是用例:

用户调用API。API发现它正在覆盖某些内容 以前保存的。要取得成功,用户需要说“是的,开始” “前进并覆盖”或“否,不覆盖”。所以基本上需要一种方法 返回响应并获取用户选择的请求,以及 然后继续操作

我关注的是:

  • 这样做的最佳实践是什么
  • 如果我暂停服务并根据需要返回回复。我是否需要在用户输入选项后启动相同的API

我正在使用Nodejs/Express和Angularjs。

如果您只想开发API,那么您可以:

  • 创建另一个API检查数据是否存在;然后

  • 与用户确认后继续API

  • 或:

    在API中做另一个标记,如“canOverwrite”,并在调用API之前与用户确认是否可以覆盖数据(如果存在)


    使用WebSocket而不是HTTP调用还可以让您灵活地发出确认(但可能不适用于AngularJS)

    每个API请求可能都应该是无状态的。为此,您向API添加了一个选项,该选项指示服务器在发生覆盖时应该做什么。客户端可以指定覆盖(如果存在)或不覆盖,并返回数据已存在的状态

    然后由客户机决定是否提示用户并进行第二次API调用以请求覆盖。这是客户端行为,而不是服务器策略


    如果客户机首先发送
    donotoverwrite
    ,然后在提示后进行第二次API调用,请求覆盖,那么服务器可能必须从头开始重新运行API调用。是否可以临时缓存第一个请求中的任何内容以提高第二个请求的性能取决于具体的实现。这是服务器上的一个实现选择,与任何其他提高性能的缓存一样。

    正如上面提到的@jfriend00,RESTAPI应该是无状态的。但您可以通过后端nodeJs代码实现这一点。事实上,这只是一种幻觉,但事实并非如此

    所以有两个端点,比如

  • /data/verify

    这将只检查数据库中是否存在数据,并向UI发送true或false

  • /data/add

    现在,如果用户想要覆盖并单击UI上的“覆盖”按钮或其他内容,则向该端点发送一个请求,该请求将覆盖数据


  • 如果用户不想覆盖,请不要调用添加端点。

    检查一个API调用中是否存在数据,然后根据客户端中的数据做出决定是一种竞争条件。检查然后应用覆盖逻辑需要是服务器上的一个原子操作,以避免与某些其他API请求发生争用,从而更改数据是否存在。@j_k,如下面的ans中所指出。如果验证API和继续操作API之间存在数据更改,如果API处理您需要的事务数据,该怎么办具有与验证api和更新相关联的时间戳Pai@SiddharthSrivastva,当您读取数据时,还必须获取数据的时间戳(LastUpdateTime)。在验证数据时需要使用此选项。如果数据被其他用户修改,则通过验证API传递的时间戳与表中的时间戳将不匹配。@j_k让我测试一下。我会尽快让你知道问题是其他人可能在验证和添加数据之间添加了数据。在这种情况下,add端点仍然需要正确运行,而不仅仅是假设如果调用它,那么应该覆盖其中的任何内容。另请参见另一个答案,该答案提出了这一点。可能在验证api中,可以在数据中设置一个标志,将数据锁定一段指定的时间?随后的verify调用只会检查lockState,并在其已锁定时退出。这样就可以避免比赛状态。所以。。。有状态的?而不仅仅是它的幻觉。那会管用的,但不是很安静
    /data/verify
    受竞态条件的影响,因为在返回结果和客户端根据结果做出某些决策之间,数据可能会发生变化。这与不推荐使用
    fs.existsSync(path)
    的原因相同。在不受比赛条件限制的情况下使用它是不安全的。相反,您可以告诉服务器您要执行的操作,如果数据已经存在,您可以告诉服务器该怎么做,然后服务器可以实现原子检查和操作。除非你有状态锁,否则只有服务器可以实现原子操作。我就是这样做的。没有“overwrite”标志但实际上是覆盖的请求返回405,客户端将其解释为“必须已有数据,需要请求用户显式覆盖”。