我正在使用NodeJS探索服务器端JavaScript并使用ExpressJS编写REST API。我的REST API用于配置设备,就像配置家庭路由器一样。我想阻止并行REST调用尝试配置客户端而不会阻止多个非配置请求。
示例API资源:
/api/config/network
/api/config/filesystem
在我的示例API中,从概念上讲,我希望一个客户端能够配置网络资源,而另一个客户端配置文件系统资源,同时允许其他客户端查询这些资源。
我不确定如何使用JavaScripts异步编程模型来实现这一目标。我来自非异步编程背景(多线程C ++)。我无法解决这个问题并且想知道用什么方法可以手动解决这个问题,如果我必须编写插件/模块怎么办?
答案 0 :(得分:8)
当您的快递应用程序收到编辑配置的请求时,请将项目添加到配置为并发为1的async.js queue。这将阻止> 1个并发尝试编辑远程配置。伪代码将是:
updateNetworkConfig
功能var networkQueue = async.queue(updateNetworkConfig, 1);
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
为真,则表示已经有正在进行的更新,要么将其排队,要么将其拒绝。