質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Q&A

解決済

2回答

1504閲覧

Node.jsにおけるルーティングと非同期処理について

sandboxA

総合スコア74

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

2グッド

1クリップ

投稿2018/06/02 15:13

お世話になっています。

node.jsにおいて、レスポンスを送信してから非同期処理が走ることはあり得ますか。
例えば以下のコードがあります。

node.js

1app.get('/', function (req, res) { 2 3 res.writeHead(200, ContentTypeCss); 4 res.end(fs.readFileSync(html)); 5 6 process("",function() 7 { 8 test(); 9 }); 10 11});

コード中に存在するメソッドのprocessが非同期処理処理で、
コールバックでtestというメソッドが呼ばれます。(というつもりで書きました。

で、このprocessは最高に待たされるとんでもないメソッドであります。
最高に遅い、その為非同期処理としています。

で、そのような場合、resをクライアントに送った後にこのprocess及びtestが実行されることが
node.jsのアーキテクト上あり得るのか、ということを伺いたく思います。
(言い換えると、クライアントにレスポンスを返す時、同期非同期問わず全ての処理が終了していることが保証されているかどうか、ということになります)

Yuji17, set0gut1👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

resをクライアントに送った後にこのprocess及びtestが実行されることが。。。

Expressはresというインスタンスをクローズさせ、
res.jsonやres.endを複数回呼んだら例外投げるくらいのことしかやってなかったかと思います。

Node.jsの仕様上process.exitや例外を投げたりして無理やり処理をクローズさせる事は可能と言えば可能ですが、そんな事をすると様々なところに歪みが発生してしまいますのでやってないでしょう。

processは最高に待たされるとんでもないメソッド

このprocessというのはNode.jsの予約語であり、勝手に命名して使ったら駄目なやつですが、なんとなく把握しました。

Webサーバは
実践で構築する際は以下のようにしておくと良いかと思います。

  • リクエストの入力値のバリデート
  • バリデートが通ったら、DB的なものに受理済リストとして保存
  • クライアントへは正常に受理しましたよ結果を返す

更に別プロセスで下記のような仕組みのバッチを作成しておき、
受理済リストを参照して順次処理を行っていくという仕組みを構築しておく案があります。

JavaScript

1const nextProcess = () => { 2 // DB的なものから受理済リストを1件だけ取り出す 3} 4const main = () => { 5 const next = nextProcess() 6 if (!next) { 7 setTimeout(main, 1000) 8 return 9 } 10 // 件の超重い処理 11 setTimeout(main, 500) 12} 13 14main()

投稿2018/06/03 01:20

miyabi-sun

総合スコア21158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

で、そのような場合、resをクライアントに送った後にこのprocess及びtestが実行されることが

node.jsのアーキテクト上あり得るのか、ということを伺いたく思います

質問の背景がわからないのですが、コーディングを見ると res.end を呼んだあとに process を呼んでいるので、当然、クライアントにレスポンスを送信したあとにprocess及びtestが実行されることになると思います。

もし、クライアントにレスポンスを返す時、同期非同期問わず全ての処理が終了していることを保証したいのであれば、 以下のように test() のあとで res.end を呼ぶ必要があります。

javascript

1app.get('/', function (req, res) { 2 3 res.writeHead(200, ContentTypeCss); 4 5 process("",function() 6 { 7 test(); 8 res.end(fs.readFileSync(html)); 9 }); 10 11});

ちなみにサーバ側で readFileSync のような同期型のAPIを利用するのはおすすめできません。 node.js の1個しかないスレッドがここで止まってしまい、性能が出ません。

投稿2018/06/02 22:05

編集2018/06/02 22:07
mit0223

総合スコア3401

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sandboxA

2018/06/02 23:17

ありがとうございました。助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問