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

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

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

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

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

Q&A

解決済

1回答

881閲覧

Passport.jsのログイン処理をPromiseで書き換えたい

maskmelon

総合スコア63

Node.js

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

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

0グッド

0クリップ

投稿2020/08/22 04:26

JavaScript

1// エラーコールバック 2router.post('/login', (req, res, next) => { 3 const user = new User(req.body); 4 5 req.login(user, (err) => { 6 if (err) { 7 next(err); 8 } else { 9 passport.authenticate('local')(req, res, () => { 10 res.redirect('/'); 11 }); 12 } 13 }); 14});

JavaScript

1// Promise 2router.post('/login', (req, res, next) => { 3 const user = new User(req.body); 4 5 req.login(user).then(passport.authenticate('local')(req, res, () => { 6 res.redirect('/'); 7 })); 8});

Node.jsを使ってアプリを作っており、ログイン認証にPassport.jsのローカルストラテジを使っています。ログイン処理の記述を上記のようにPromiseを使って書き換えてみたのですが、req#login requires a callback functionというエラーが発生しました。

書き換え方が間違っているのでしょうか?あるいはエラーコールバックにしか対応していないということも有り得るのでしょうか?(ドキュメントは上に書いたエラーコールバックの形で記述されています)

ご指摘いただけると幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

従来の最終引数にコールバック関数を渡して実行してもらう非同期処理は、
勝手にPromiseになったりはしません。

値.thenは単純にthenプロパティを参照するという意味で、
Promiseインスタンスはthenプロパティをメソッドとして所持しているので、
実行出来るというだけの話です。

js

1function hoge(cb) { 2 // もしcallbackが存在するなら実行する 3 if (cb) cb(); 4} 5console.log(hoge()); 6// 返り値がないのでundefined 7 8// undefinedのthenプロパティを閲覧しようとすると当然エラー 9console.log(hoge().then); 10// Uncaught TypeError: Cannot read property 'then' of undefined 11 12// 実行するとPromiseインスタンスを作って返す関数を宣言 13const piko = () => new Promise(resolve => { 14 resolve() 15}) 16 17// Promiseインスタンスを受け取ったら、それにはthenメソッドは存在するよね 18console.log(piko().then); 19// ƒ then() { [native code] } 20 21piko().then(() => console.log(123)); 22// 123

能書きはわかった。
で、このPassport.jsとやらはPromise対応なのか?非対応なのか?

見ていきましょう。

PromiseはES2015で追加されました。
大昔から存在し、新しいものを瞬時に取り込むNode.jsにもかなり早い段階で導入されました。
対応リストで確認すると、0.12.18時点で多くの機能が利用可能になってるんですね。

対するPassport.jsはGitHubで公開されており、
プロジェクトの仕様はpackage.jsonを見れば分かるようになっています。

json

1 "engines": { 2 "node": ">= 0.4.0" 3 },

enginesによると動作保証しているバージョンはNode.jsの0.4系、
0.12系より大幅に昔……

あっダメっぽい!

GitHubのIssueも見つけました。
Add support promises flow #536というまんまな要望があります。

ざっと読んだ感じ、2017年からPromise対応してくれーみたいな要望があがっているようですね。
うだうだ2-3年やり取りしてて、まだクローズなければマージされたプルリクもない。

結局音沙汰なしで放置かい。
非対応確定です。


結局どうすりゃええねん
Promiseベースでやりたければラッピングするしかないでしょうね。

passport.authenticate() using a Promise instead of a Custom Callback
という質問がスタックオーバーフローに存在しています。

これの回答がコールバックを無理やりPromiseに変換するライブラリでも噛ましたら?
const {promisify} = require("es6-promisify");はそれを目的としたライブラリの一部です。

es6というのはes2015という実装が決まるまでの仮の名前なので、
bluebirdを使ってラッピングした方が良いんじゃないですかね?

使い方はbluebird promiseみたいなワードで検索すれば出てくるんで頑張ってみてください。

投稿2020/08/24 06:17

miyabi-sun

総合スコア21158

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

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

maskmelon

2020/08/25 17:17

調べ方まで教えていただきありがとうございます。 当たり前のようにPromiseを使っていましたが、ご指摘の通りPromiseを返す実装でなければ使えないのは当然ですね。 ライブラリについても参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問