2017-12-23 12 views
1

データベースに格納されているユーザーの入力を取得するためにアルゴリズムを実行する必要がある特定の時間が経過した後、一部のユーザーが入力するWebサイトを構築していますその結果をデータベースにも格納するための結果を作成します。問題は、nodejsでは、特定の時間後に1回だけ(数分または数秒ごとに)実行するために、このアルゴリズムをどこでどのように実装すべきかを理解できないことです。 アプリはnodejs-expressjsでビルドされています。 たとえば、アプリケーションを起動して3分後にアルゴリズムが実行され、データベースからデータが取り出され、アルゴリズムが作成された後に、データベースに再度出力が格納されるとします。 その典型的な解決策は何ですか(少なくとも1つで十分です)。ありがとうございました!nodejs - 特定の時刻に関数を実行する

userIdをDBに作成し、ユーザーの要求に 「タスク」テーブルを:

+0

私はあなたの問題を理解していませんが、これはあなたが探しているものかもしれません:[node-cron](https://github.com/kelektiv/node-cron) – Josh

+0

おそらく '将来指定するときに呼び出される関数をスケジュールするためのsetTimeout()を提供します。 – jfriend00

答えて

1

レッツだから、最も簡単な方法の一つは、になりますが、記載された製品に

をクロールして取得するためのURLを保存し、ユーザの要求を持っていると言います| urlToCrawl | dateAdded | isProcessing | ....

次にノードメインサイトであなたには、いくつかのsetInterval(findAndProcessNewTasks、60000)を持っている ので、1分ごとの作業では、現在ではありませんすべてのタスク(isProcessingはfalse) を取得するか、必要なものは何でも間隔

findAndProcessNewTasks は、DBを照会しても、それはアルゴリズムが終了すると、最終的にそれが仕事からレコードを削除(またはいくつかの別のフィールドをマークする真 にisProcessing設定されますまだ に処理されていないすべてのレコードのためにあなたのアルゴリズムを実行します「完了」のように)

負荷とタスクの数に応じて、それは意味が一般的にあなたがメインのアプリはちょうどイベントやワーカーノードを送信すると、メッセージバス(カフカ、RabbitMQのなど)を持っているだろう、別のノードアプリ

であなたのアルゴリズムを処理することがあります。 JSアプリが実際に仕事をしていると、これがメインアプリは軽量化と私が正しくあなたを理解していれば、ワーカーのアプリに

+0

はい、しかし、私の問題は、私はnodejsでいるので、私は、のsetIntervalやsetTimeout関数を置くべきファイルIを知らないということである - 、表現するファイルは、ユーザーが要求を行うことを毎回実行されます(私は私の仮説が間違っていないことを願う)もしそうなら私は隠されたルートを持つことができ、もちろん、そのルート内のユーザの要求と同じくらいのアルゴリズムを実行し、呼び出す関数のsetIntervalは、ただ私だけが知っているだろうが、私はそれをやりたいいけないルートの例のためにそれを置きます手動で、私は初期化/スケジュールは、アプリケーションが起動し、一度だけ呼び出されるようにしたい。 – user2487076

+0

各要求ごとに間隔を設定する必要はありません。 あなたはそれが新しいタスクをチェックされるだけで一つのメインindex.jsファイル内(または何が実行され、呼び出しapp.listen()) ので、すべての時間を必要とし、一度にすべてを実行します。 "dateAdded"ではなく "dateAdded"の代わりに実行する必要がある時間が計算時間を含む "dateToExecute"フィールドに依存する場合 タイマーは1回作成され、N秒間隔で実行され、実行するタスク –

0

をスケーリングできるようになるデシベル

に製品を挿入する - ページをレンダリングしながら、私はクライアント側にデータを送信しますいくつかの隠しタグ(input type = "hidden"など)に格納します。次に、setTimeoutを使用してサーバー側でスクリプトを実行して、クライアントにデータを表示します。

関連する問題