使用一个函数的结果作为另一个函数的变量 - node.js

时间:2018-02-08 08:06:13

标签: javascript node.js function jwt

我正在编写node.js脚本来生成GitHub安装访问令牌。这就是我所拥有的:

const axios = require("axios");
var fs = require('fs');
var jwt = require("jsonwebtoken");

var gitInstallationAccessToken = {
  genJWTToken: function(callback) {
    var private_key = fs.readFileSync("/path/to/my/pemfile.pem");

  const now = Math.round(Date.now() / 1000);
  const payload = {
    iat : now,
    exp : now + (10 * 60),
    iss : 7233
  };

  const token = jwt.sign(payload, private_key, { algorithm: 'RS256' })
  callback(token);
  },

  genInstallationAccessToken: function(token, callback) {
    var jwt = gitInstallationAccessToken.genJWTToken(function(token) {
      return token;
    });
    console.log("JWT: ", jwt)
    var instance = axios({
      method: "post",
      url: "https://api.github.com/installations/:installation_id/access_tokens",
      headers: {
        "Accept" : "application/vnd.github.machine-man-preview+json",
        "Authorization" : `Bearer ${jwt}`
      }
    })
    .then(function(response) {
      console.log("Response: ",response.data);
      callback(response);
    })
    .catch(function(error) {
      console.warn("Unable to authenticate");
      // The request was made and the server responded with a status code
      // that falls out of the range of 2xx
      if (error.response) {
        console.warn(`Status ${error.response.status}`);
        console.warn(`${error.response.data.message}`);
      }
    });
  }
}

module.exports = gitInstallationAccessToken;

gitInstallationAccessToken.genInstallationAccessToken(function(response) {
  console.log("response: ", response)
});

我的JWT令牌由genJWTToken生成。我可以看到,如果我在console.log("Token: ", token)回调之前添加genJWTToken

我现在需要在genInstallationAccessToken中使用该令牌,但我明确地说错了。如下所示返回undefined:

var jwt = gitInstallationAccessToken.genJWTToken(function(token) {
  return token;
});
console.log("JWT: ", jwt)

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

我认为你应该考虑重构这个并使用链式承诺,它会更容易理解和控制..

这样的事情:



function getToken() {
  return new Promise(function(resolve, reject) {
  	 resolve('token')
  })
}


function chainPromise() {
	var token
  getToken().then((response) => {
  	token = response
    console.log(token)
  }).then(() => {
  	console.log('I am here and also see: ', token)
  })
}

chainPromise()




然后,您应该能够轻松地追踪令牌的路径