WordPress REST API、Node.js + Express + EJS、MongoDBを使い複数サイトを一本化するPart1.5

WordPress REST API、Node.js + Express + EJS、MongoDBを使い複数サイトを一本化するPart1.5
Part1では、”APIを使って複数サイトのデータをMongoDBへ保存する方法”を説明したものの、少し腑に落ちないところがあったので該当部分を書き直した。従ってPart1.5となる(笑)そのままコピペすれば、作動するコードも掲載するので参考まで。

Part1で使用したasyncモジュールは、いろいろな作動モードがあり、async.seriesで動かした。この場合、callbackが呼ばれるまでは次の処理に進まず、見かけ上、同期作動となる。

ただ考えてみれば、collectionのdrop、各APIの読み込みは非同期で作動しても問題無く、順番待ちをしている時間が無駄になる。従って流れとしては…。

  1. 同期用のwp0にあるposts、categories、tagsのdropは非同期だが、全部終わるのを待つ
  2. 各APIの読み込みは非同期だが、全部終わるのを待つ
  3. 表示用のwpにあるposts、categories、tagsのdropは非同期だが、全部終わるのを待つ
  4. 最後にwp0をwpへコピーする

以上の順番さえ守れば、DBの更新に影響なく、加えて、各パートは非同期なので、全てをasync.seriesで行うよりも処理時間が短くなる。このようなケースにはasync.parallelを使用する。

上のvar群は関連するモジュールや変数の宣言で特に説明の必要は無いだろう。ポイントは、async.parallelの部分。wp0の各collectionのdropは非同期で作動し、全部終了した時に、function (err, results)を実行する。

step1()は、各APIで得たデータをmongoDBに保存する部分だ。前回は順番に行っていたが、今回は5つのAPIの読み込みが非同期作動となる。全て終了後、step2()を実行。

step2()は、wp0をwpへコピーする時、コピー先にcollectionがあると失敗するので、先に3つのcollectionをdropする。dbReload()直後と全く同じで対象がwp0かwpかの違いだけだ。

step3()はwp0からwpへDBをまるまるコピーする部分となる。これで一連の流れは完了する。

最後に、APIから得たデータをmongoDBへ保存する=SetCollection()を掲載する。前回との違いは、フラグを使い中でcollectionをdropする部分を削除している(APIがhttpかhttpsかの判断も追加)。

と言うのも、非同期で作動する場合、記述した順に実行されるとは限らず、dropせずに追記してしまうケースが発生するからだ。今回はこれを避けるため、一番初めにwp0からdropしているのはご覧の通り。

以前掲載した”WordPress REST APIで得たJSONをNode.jsとMongoDBを使い保存する”に関しても、今回のコードの方がよりロジカルなので、こちらを参考にして欲しい。単一サイトの場合は、step1()のsite 2が不要となる。

Part2で説明するExpress + EJSはmongoDBにwpさえあれば作動するので、今回の部分は別扱いにして、cronを使い一定間隔でDBへリロードするのがいいかも知れない。

実験サイトはこちら