2

我正在使用 NodeJS 探索服务器端 JavaScript,并使用 ExpressJS 编写 REST API。我的 REST API 用于配置设备,就像配置家庭路由器一样。我想阻止并行 REST 调用尝试配置客户端而不阻止多个非配置请求。

示例 API 资源:

/api/config/network
/api/config/filesystem

在我的示例 API 中,从概念上讲,我希望一个客户端能够配置网络资源,而另一个客户端配置文件系统资源,同时允许其他客户端查询这些资源。

我不确定如何使用 JavaScripts 异步编程模型来实现这一点。我来自非异步编程背景(多线程 C++)。我无法解决这个问题,想知道有什么方法可以手动解决这个问题,如果我必须编写插件/模块怎么办?

4

1 回答 1

8

当您的 express 应用收到编辑配置的请求时,将项目添加到配置为并发 1 的async.js 队列。这将防止 > 1 并发尝试编辑远程配置。伪代码将是:

  • 在应用程序启动时,定义您的updateNetworkConfig功能
  • 在应用启动时,创建一个并发队列 1
    • var networkQueue = async.queue(updateNetworkConfig, 1);
  • REST 像 PUT /api/config/network 一样使用新配置作为 JSON 中的请求正文
  • 将一个项目添加到队列中,传递新的配置数据
    • networkQueue.push(req.body.config);
    • req.body由 bodyParser 连接中间件提供)
  • 为每个独立配置重复该设置:文件系统等

您将需要一堆其他管道来处理回调并在保存配置时通知 REST 客户端。如果队列不为空,则由您决定是否排队呼叫或拒绝新呼叫。

由于您坚持不学习和使用令人敬畏的 async.js 库,这将提高您对异步编程的流畅度并教给您有价值的东西,这就是交易。使用这个叫做变量的东西。

var updatingNetwork = false;
app.put('/api/config/network', function (req, res) {
   if (updatingNetwork) {
       return res.status(409).send("Try later");
   }
   updatingNetwork = true;
   updateNetworkConfig(req.body.config, function (error) {
       updatingNetwork = false;
       if (error) {
           return res.status(500).send(error);
       }
       res.status(200).send("done");
   });   
});
  • 当一个请求进来时,如果updatingNetwork是真的,你知道已经有一个更新在处理中,要么排队要么拒绝它。
于 2013-03-04T19:32:21.610 回答