質問: ### 前提・実現したいこと node.js + express + passportでGoogleアカウントでログインする機能を作っています。 passportのGuideを見ても意味がわからない状態です。 ### 発生している問題・エラーメッセージ function()とdone()がどうのようなことを行っているのかわかりません。 例として、以下のようにpassportのコードがあった場合、 fucntion()とdone()が何をしているのか教えてください ``` passport.serializeUser(function(user, done) { done(null, user.id); }); passport.deserializeUser(function(id, done) { User.findById(id, function(err, user) { done(err, user); }); }); ``` ### 試したこと ぐぐったところ、function()はコールバック関数という名前らしいですが、 function()の引数の説明や、function(res,req)やfunction(user,done)が実際にどのような意味を持っているのかまったくわかりませんでした。 done()についても同様です。 上記コードをもとに説明をお願いします。
回答: コールバック関数等に関しては,下記記事に詳細な解説があるので読んでみてください. JavaScript中級者への道【5. コールバック関数】 - Qiita (発展) JavaScriptは如何にしてAsync/Awaitを獲得したのか Qiita版 - Qiita (補足)日本語のコードで理解するPromise - Qiita ここでの`function () { ... }`は「準備ができたタイミングで関数を呼ぶ」の対象となるそれです. Passportの`done`に関しては以下に日本語で説明があります. Passport | 設定 要するに,`done`はEventEmitter的に,「成功したよ」「失敗したよ」と**Passport内部に対して**通知するイベントを発行しているようなものでしょうか. > > このようにストラテジーに処理を委譲することで、検証用コールバックは、Passportとデータベースを疎に保ちます。 これによりアプリケーションは、認証レイヤーでの様々な前提条件にとらわれず、ユーザー情報をどのように格納するか自由に選択できます。 > > > * `serializeUser` 「ユーザオブジェクトを与えてやるから,保存に成功したら`done`の第2引数ででユーザIDを渡してくれ.エラーがあったときは第1引数にそれを渡してくれ.続く処理は俺(Passport)がやるからとりあえずその仕事だけよろしく.」 * `deserializeUser` 「ユーザIDを渡してやるから,復元に成功したら`done`の第2引数でユーザオブジェクトを渡してくれ.エラーがあったときは第1引数にそれを渡してくれ.続く処理は俺(Passport)がやるからとりあえずその仕事だけよろしく.」 こういうことですね.実際にどのように保存や復元を行うかはプログラマが自由に選択できるということです.関数の返り値を使わずにわざわざ`done`を実行させるのは,JavaScriptはおもに,非同期処理の実現にはコールバック関数モデルを採用しているからです. ``` User.findById(id, function(err, user) { /* 成功または失敗時の処理 */ }); ``` `User.findById`がこのような使い方である以上,完了時に`done`を呼ばせるしかないですよね. (もし`Promise`を返すような設計になっていれば必ずしもそうではないのですが...)