2016-12-14 16 views
0

私はnodejsを初めて使用していますので、認証システムを作成しようとしていました。私はチュートリアルの後にそれを実装しました。 認証されたときにユーザーオブジェクトをフェッチするには、セッションにセッションを格納する必要があります。次のように私はexpress-sessionを設定することで、そのようにした:Passport - ユーザーがセッションに保存されていません

require('./config/passport')(passport); // pass passport for configuration 

app.use(session({ 
    secret: 'thisisagreatgreatsecretforthesession', 
    resave: true, 
    saveUninitialized: true 
})); 

app.use(morgan('dev')); 
app.use(cookieParser()); 
app.use(bodyParser.urlencoded({ extended : false })); 
app.use(bodyParser.json()); 

app.use(passport.initialize()); 
app.use(passport.session()); 
app.use(flash()); 

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


var routes = require('./app/routes')(app, passport); 

をし、次のようにパスポートに私はシリアル化およびデシリアライズ機能を設定した:

passport.serializeUser(function(user, done) { 
     done(null, user.id); 
    }); 

passport.deserializeUser(function(id, done) { 
     User.findById(id, function(err, user) { 
      done(err, user); 
     }); 
    }); 

私はdeserializeUser機能で、ユーザコンソールしようとしましたが、それがありました正しい。しかし、私がuserをテンプレートに呼び出すと、ユーザーが定義されていないことを示すエラーが表示されました。

設定に何か不足していますか?

答えて

0

セッションプロパティは、デフォルトでテンプレートに公開されません。 、このミドルウェアはsessionとパスポートミドルウェアを追加されていることを確認してください(

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

は、あなたがそれを公開する簡単なエクスプレスミドルウェアを使用することができ、あなたのテンプレートからreq.userにアクセスしたい場合しかしuserにアクセスするテンプレートをレンダリング前に任意のルートは、エクスプレス、あなたはミドルウェアの事項を宣言した順序)で

これはを使用していますすべてのテンプレートにデータを公開する手段としてを使用します。実際、Expressのドキュメントを見ると、ユーザーデータを公開する方法の例とまったく同じコードがほとんど表示されます。

+0

私は今、どん​​なエラーも出ませんが、 'user'を使うとテンプレートには何も表示されません。これまでの設定の順序は正しいですか? – omarsafwany

+0

エラーが表示されない場合、テンプレートは 'user'にアクセスできます。ミドルウェアの内部に 'console.log(req.user)'を追加して、実際に値があることを確認することができます(テンプレートのプロパティを使用する必要があるオブジェクトは 'user.username'やそんな感じ)。 – robertklep

+0

'console.log(req.user)'はうまく動作しますが、 '<%user.name%> 'を使用するとテンプレートで – omarsafwany

関連する問題