如何在没有承诺的情况下返回函数内的值(访问令牌)?

时间:2019-09-16 05:48:44

标签: javascript node.js api express spotify

const callback = (req, res) => {

  // your application requests refresh and access tokens
  // after checking the state parameter

  if (state === null || state !== storedState) {
   ...
  } else {
    res.clearCookie(stateKey);
    var authOptions = {...};

//rq = require-promise
    rq.post(authOptions, function(error, response, body) {
      if (!error && response.statusCode === 200) {

        var access_token = body.access_token,
            refresh_token = body.refresh_token;

        // we can also pass the token to the browser to make requests from there
        res.redirect('/#' +
          querystring.stringify({
            access_token: access_token,
            refresh_token: refresh_token
          }));
      } 
    });
  }
};

我有将此功能导出为module,因此登录后Spotify重定向到/ callback时,可以在主app.js中用作middleware功能。< / p>

由于我无法兑现承诺,因此在使用.then检索值之后,我想知道如何才能获得登录另一个access_token后生成的module

谢谢。

1 个答案:

答案 0 :(得分:0)

您可以在中间件之间共享值并在 req.xml 中定义它。为了更简单的解释,这是一个例子:

// the first middleware : checkAuth.js
const jwt = require('jsonwebtoken')

const authValidator = async (req,res,next) => {
  // check token as requirement for auth user
  let token = req.headers['authorization']
  try {
    let verifiedUser = await jwt.verify(token, 'yoursecret', (err, decode) => {
      if (err) return res.send(err.message)
      return decode
    })
    // assign verifiedUser to req
    req.userData = verifiedUser
    // passing to next middleware
    next()
  } catch (err) {
    return res.send('no token provided')
  }
}

exports.authValidator = authValidator

它共享给另一个中间件:

// second middleware : checkRole.js
const roleUser = async (req,res,next) => {
  try {
    // call the req.UserData and assign other value
    if (req.UserData) req.userRole = 'Administrator'
    // passing to next middleware
    next()
  } catch (err) {
    return res.send('ooppsss')
  }
}

exports.roleUser = roleUser

在这条路线中你可以得到它们:

const { Router } = require('express')
const router = Router()

const authValidator = require('/checkAuth.js')
const roleUser = require('./checkRole.js')

// arrange every middleware right here
router.get('/myRoute', authValidator, roleUser, async (req,res) => {
  try {
    // take all from before
    return res.json({
      ...req.userData,
      role: req.userRole
    })
  } catch (err) {
    return res.send('oopsss')
  }
})