如何序列化NodeJS?

sno*_*lhg 2 javascript rest node.js

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

API资源示例:

/api/config/network
/api/config/filesystem
Run Code Online (Sandbox Code Playgroud)

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

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

Pet*_*ons 8

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

  • 在应用启动时,定义您的updateNetworkConfig功能
  • 在app启动时,创建一个并发队列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");
   });   
});
Run Code Online (Sandbox Code Playgroud)
  • 当一个请求进来时,如果updatingNetwork是,你知道已经有一个正在进行的更新,要么将其排队,要么拒绝它.