如何序列化NodeJS?

时间:2013-03-04 19:10:36

标签: javascript node.js rest

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

示例API资源:

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

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

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

1 个答案:

答案 0 :(得分:8)

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

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

您需要一堆其他管道来处理回调,并在保存配置时通知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为真,则表示已经有正在进行的更新,要么将其排队,要么将其拒绝。