Promise 未在 https 调用中解析

Promise not resolving in https call

我正在 API 网关后面编写一个 AWS Lambda 函数,它使用 Facebook 和我们的应用程序 ID 验证令牌,这样我们就可以确认用户的身份,以便他可以删除他的资源。用户从 Facebook 登录名发送他的用户 ID 和令牌,我检查令牌是否有效以及是否属于同一用户。在实现中我使用了 promises 但问题是第一个 then 根本没有执行。我首先调用 getFacebookAccessToken,这样我就可以调用 API 并在响应中解决或拒绝,但代码没有达到这一点。这是函数:

'use strict';

const https = require('https');
const querystring = require('querystring');

exports.handler = (event, context, callback) => {

 if (typeof event.body.token === 'undefined' || event.body.token === '') {

  context.succeed({
   "result":"false",
   "message": `InputError: token is not defined or it is empty`
  });
  return;
 }
 if (typeof event.body.userId === 'undefined' || event.body.userId === '') {

  context.succeed({
   "result":"false",
   "message": `InputError: userId is not defined or it is empty`
  });
  return;
 }

 getFacebookAccessToken()
  .then((appAccessToken) => {

   return checkFacebookId(appAccessToken, event.body.token, event.body.userId);
  })
  .then((result) => {

   console.log('Done');
   context.succeed(result);
  })
  .catch((error) => {

   context.succeed(error);
  });
};

let checkFacebookId = (appAccessToken, token, facebookId) => {

 return new Promise((resolve, reject) => {

  let params = {
   input_token: token,
   access_token: appAccessToken
  };

  let requestParams = querystring.stringify(params);

  let configOptions = {
   method: "get",
   hostname: "graph.facebook.com",
   path: "/debug_token?" + requestParams
  };

  let request = https.request(configOptions, function (result) {

   let response = "";
   result.setEncoding('utf8');
   result.on('data', function (chunk) {

    response += chunk;
   });

   result.on('end', function () {

    const fbResponse = JSON.parse(response);

    if (result.statusCode.toString() === '200') {

     console.log(`Validating facebook token: OK`);

     if (typeof fbResponse.data === 'undefined') {
      reject({
       "result": "false",
       "message": "Token not valid"
      });
     }
     if (fbResponse.data.user_id === facebookId) {
      resolve({
       "result": "true"
      });
     } else {
      reject({
       "result": "false",
       "message": "Token not valid"
      });
     }
    }
    else {

     reject({
      "result": "false",
      "error": {
       "Message": `Failed validating facebook user access token`,
       "statusCode": result.statusCode,
       "token_valid": fbResponse
      }
     });
    }
   });
  });

  request.on('error', function (error) {
   reject({
    "result": "false",
    "message": "Error in Facebook",
    "error": error
   });
  });

  console.log(`Validating facebook token: PENDING`);
  request.end();
 });
};

let getFacebookAccessToken = () => {

 return new Promise((resolve, reject) => {

  let params = {
   client_id: event.stage.fb_app_id,
   client_secret: event.stage.fb_app_secret,
   grant_type: "client_credentials"
  };

  let requestParams = querystring.stringify(params);

  let configOptions = {
   method: "get",
   hostname: "graph.facebook.com",
   path: "/oauth/access_token?" + requestParams
  };
  let request = https.request(configOptions, function (result) {

   let responseData = "";
   result.setEncoding('utf8');
   result.on('data', function (chunk) {

    responseData += chunk;
   });

   result.on('end', function () {
    console.log(result);
    if (result.statusCode.toString() === '200') {

     console.log(`Getting Facebook Access Token: OK`);
     resolve(JSON.parse(responseData).access_token);
    }
    else {

     reject({
      "result": "false",
      "error": {
       "Message": `Failed getting facebook access token`,
       "statusCode": result.statusCode
      }
     });
    }
   });
  });

  request.on('error', function (error) {
   reject({
    "result": "false",
    "message": "Error in Facebook",
    "error": error
   });
  });

  console.log(`Getting Facebook Access Token: PENDING`);
  request.end();
 });
};

承诺中存在 JavaScript 错误。 event.stage.fb_app_id 和 secret 不在函数范围内,这很明显,但由于 catch,错误是无声的,我得到一个空对象。