2016-04-25 14 views
11

私はNode.jsを使い慣れていないので、私はまだ非同期関数とコールバックを取り巻いています。私の苦労は、非同期操作でファイルからデータを読み込んだ後に応答を返す方法です。Node.jsとExpress:非同期操作の後に応答を返す方法

私の理解では、応答を送信すると、このように動作します(これは私のために動作します)ということである。

app.get('/search', function (req, res) { 
    res.send("request received"); 
}); 

しかし、今私は、ファイルを読み込んだデータにいくつかの操作を実行し、返すようにしたいです応答が返されます。データに対して実行したい操作が簡単だった場合は、インラインで実行し、依然として有効範囲内にあるのでresオブジェクトへのアクセスを維持します。

app.get('/search', function (req, res) { 
    fs.readFile("data.txt", function(err, data) { 
     result = process(data.toString()); 
     res.send(result); 
    }); 
}); 

しかし、私は実行する必要があるファイル操作は、私は別のファイルに、独自の機能にそれらを分離したことを長くし、十分に複雑です。その結果、私のコードはより次のようになります。

app.get('/search', function (req, res) { 
    searcher.do_search(res.query); 
    // ??? Now what ??? 
}); 

私は結果を送信するためにres.sendを呼び出す必要があります。しかし、私はdo_searchが非同期的に完了するので、上記の関数で直接呼び出すことはできません。 resオブジェクトがそのスコープに含まれていないため、do_searchというコールバックで呼び出すことはできません。

誰かがNode.jsでこれを処理する適切な方法を理解できますか?

+0

私は、 'res'オブジェクトをパラメータとして関数に渡すか、関数をパラメータとして渡して、作業が完了したときに呼び出すようにします折り返し電話)。後者はおそらくあなたのコードをExpressのAPIに結合しないので、おそらくより良いでしょう。 –

答えて

13

異なる関数の変数にアクセスするには、共有スコープがない場合は引数として渡します。

resを渡して、関数内の1つの変数のquerysendの両方にアクセスすることができます。


懸念を解消する目的で、代わりにコールバックを渡す方がよい場合があります。

次にdo_searchは、クエリを実行してから関数を実行することについて知る必要があります。これにより、より一般的な(したがって再利用可能な)ものになります。

searcher.do_search(res.query, function (data) { 
    res.send(...); 
}); 

function do_search(query, callback) { 
    callback(...); 
} 
+1

コールバックの受け渡しは間違いありません。 +1のために提案する。 –

+0

助けてくれてありがとう。私はコールバックを受け入れるためにdo_search関数を変更してしまいました。 – ekl

+0

これは質問に答えますか?どうしてこの例題には問題の関数である 'app.get'が含まれていませんか? – nobar

関連する問題