如何在Express中的请求对象上的路由之间共享数据?

时间:2017-10-14 16:20:49

标签: express spotify passport.js

我正在开发一个使用Spotify API进行身份验证的应用程序。我正在使用passport-spotify这样做。我需要能够以我的根路由(/)访问会话ID。

虽然我可以在使用Spotify进行身份验证后/callback期间设置会话ID,但我无法在/访问会话ID。有人可以向我解释如何在Express中的路由之间传递数据,以便在我通过身份验证后可以访问req.session.id中的/吗?

我会在这里分享我的终点:

/

app.get('/', cors(), (req, res) => {
  if (req.session.id != null) {
  res.json({isAuthenticated: true })
} else {
  res.json({isAuthenticated: false, message: 'Please log in.' })
}

})

护照策略

passport.use(new SpotifyStrategy({
  clientID: clientId,
  clientSecret: clientSecret,
  callbackURL: CALLBACK_URL
},
  (accessToken, refreshToken, profile, done) => {
     process.nextTick(function () {
       let user = { spotifyId: profile.id, access_token: accessToken, 
         refresh_token: refreshToken }
       return done(null, user)
    })
  }))

/auth/spotify

app.get('/auth/spotify',
  passport.authenticate('spotify', {scope: ['user-read-email', 'user-
    read-private'], showDialog: true}),
  (req, res) => {
})

/callback

app.get('/callback', passport.authenticate('spotify', { 
  failureRedirect: '/', successRedirect: FRONTEND_URL }), (req, res, 
  next) => {
  req.session.id = req.user.spotifyId
  localStorage.setItem('access_token_' + req.session.id, 
  req.user.access_token)
  localStorage.setItem('refresh_token_' + req.session.id, 
  req.user.refresh_token)
  return next(null, req.session.id)
})

1 个答案:

答案 0 :(得分:0)

无法以您提出问题的方式分享数据,其原因非常简单,它们是2个不同的req个对象。

你可以做的是定义一个单独的middlware函数,如下所示:

function middlware(req, res, next) {
  req.session.id = req.user.spotifyId;
  next();
}

在Spotify middlware之后,你将这两个路径中的函数称为middlware。