2017-07-05 17 views
0

ログインしたユーザーを探して、その情報をapp.localsに設定して、どのビューでも使用できるようにします。Mongooseで.findOneを使用してapp.localsを使用する方法

私はそうのような私server.jsファイルでそれを設定してい:

app.use(ensureAuthenticated, function(req, res, next) { 
    User.findOne({ _id: req.session.passport.user }, (err, user) => { 
    console.log('user\n', user) 
    app.locals.logged_in_user = user; 
    next(); 
    }) 
}); 

console.log('user\n', user)は、ユーザーが発見されたことを確認します。それは働いていない、

Currently, {{logged_in_user}} is logged in. 

しかし: その後、私はそのようなので、私のようlayout.hbsファイルのように、いずれかの部分で、このユーザーの情報を使用することができるはずです。回答hereは代わりにres.localsを使用するように提案されましたが、それはうまくいきませんでした。例hereは静的なデータを使用していますが、userはログインしている人に依存するため、動的なデータが必要です。

現在、すべてのルートでuser変数を定義する必要があります。どの部分的にでも使用できる変数userをグローバルに定義する方法はありますか?

+1

'res.locals'は動的情報を追加するための正しいオブジェクトであり、' app.locals'はstatic(set once)情報のみです。ミドルウェアは、テンプレートをレンダリングするルートの前に宣言されていますか?これらのルートの中で、 'res.render()'を呼び出す直前に、 'res.locals.logged_in_user'の値は何ですか? – robertklep

+0

私は 'ensureAuthenticated'を取り出して動作しました。しかし、返信いただきありがとうございます! – Farid

+1

まだ、 'app.locals'は使わないでください。または、そうしている場合は、常時1人のアクティブユーザーしかいないことを期待してください。 – robertklep

答えて

2

コードから判断してパスポートを使用しています。 documentation状態は以下:認証が成功した場合

、次のハンドラが呼び出され、req.userプロパティには、認証されたユーザに設定されます。

したがって次の(またはしかし、あなたがそれをやりたい)を行うことができます。

app.use((req, res, next) => { 
    res.locals.user = req.user 
    next() 
} 

これは、すべての要求とビューにユーザーオブジェクトを渡します。

+0

返信いただきありがとうございます。はい、私はパスポートを使用しています。自分のデータベースでユーザーを検索していないと、あなたの答えが当てはまると思います。しかし、私は 'User.findOne'を実行して自分のデータベースでユーザを見ています。次に、dbから返されたユーザオブジェクトを 'res.locals'変数に渡したいと思います。したがって、 'app.use((req、res、next)=> { )User.findOne({_id:req.session.passport.user}、(err、user)=> { res.locals.logged_in_user = user ; next(); } }); ' – Farid

+0

@Faridを適切なPassport設定で使用すると、' passport.deserializeUser'はすでにユーザーを参照しています。 – robertklep

+0

'ensureAuthenticated'を取り出すことができました。みんなありがとう。 – Farid

関連する問題