2

NodeJS を使用してサーバー サイド JavaScript を調査し、ExpressJS を使用して REST API を作成しています。私の REST API は、ホーム ルーターを構成するのと同じように、デバイスを構成するためのものです。複数の非構成要求を防止せずに、並列 REST 呼び出しがクライアントを構成しようとするのを防止したいと考えています。

API リソースの例:

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

私のサンプル API では、概念的には、あるクライアントがネットワーク リソースを構成し、別のクライアントがファイル システム リソースを構成し、他のクライアントがそれらのリソースをクエリできるようにしたいと考えています。

JavaScript の非同期プログラミング モデルでこれを実現する方法がわかりません。私は非同期プログラミング (マルチスレッド 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.bodybodyParser connect ミドルウェアが提供)
  • 独立した構成ごとにそのセットアップを繰り返します: ファイルシステムなど

コールバックを処理し、構成が保存されたときに 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が true の場合、進行中の更新が既にあることがわかります。これをキューに入れるか、拒否します。
于 2013-03-04T19:32:21.610 に答える