Lamda函数无法通过ID获取Google电子邮件

时间:2019-04-24 20:50:21

标签: javascript node.js amazon alexa

在本地,通过一个简单的nodejs应用程序,我可以通过id获取电子邮件,但是在Amazon lambda函数(也具有nodejs)中,我不是(错误消息:无法读取未定义的属性数据。

我尝试过:https://developers.google.com/gmail/api/quickstart/nodejs 效果很好。

到目前为止,我在index.js中所做的工作:(凭据和令牌json文件位于正确的位置,它们是从我的计算机上复制粘贴的,由Google示例中的nodejs应用程序生成)

/* eslint-disable  func-names */
/* eslint-disable  no-console */

const Alexa = require('ask-sdk-core');
const fs = require('fs');
const readline = require('readline');
const google = require('googleapis');
// If modifying these scopes, delete token.json.
const SCOPES = ['https://www.googleapis.com/auth/gmail.readonly'];
// The file token.json stores the user's access and refresh tokens, and is
// created automatically when the authorization flow completes for the first
// time.
const TOKEN_PATH = 'token.json';
// Load client secrets from a local file.
let speechText = 'Welcome to the Alexa Skills Kit, you can say hello!';

const LaunchRequestHandler = {
  canHandle(handlerInput) {
    return handlerInput.requestEnvelope.request.type === 'LaunchRequest';
  },
  async handle(handlerInput) {
    await fs.readFile('credentials.json', async (err, content) => {
      if (err) return console.log('Error loading client secret file:', err);
      // Authorize a client with credentials, then call the Gmail API.
      await authorize(JSON.parse(content), getMessage);
    });
    /**
     * Create an OAuth2 client with the given credentials, and then execute the
     * given callback function.
     * @param {Object} credentials The authorization client credentials.
     * @param {function} callback The callback to call with the authorized client.
     */
    function authorize(credentials, callback) {
      const {client_secret, client_id, redirect_uris} = credentials.installed;
      const oAuth2Client = new google.google.auth.OAuth2(
          client_id, client_secret, redirect_uris[0]);

      // Check if we have previously stored a token.
      fs.readFile(TOKEN_PATH, (err, token) => {
        if (err) return getNewToken(oAuth2Client, callback);
        oAuth2Client.setCredentials(JSON.parse(token));
        callback(oAuth2Client);
      });
    }

    /**
     * Get and store new token after prompting for user authorization, and then
     * execute the given callback with the authorized OAuth2 client.
     * @param {google.auth.OAuth2} oAuth2Client The OAuth2 client to get token for.
     * @param {getEventsCallback} callback The callback for the authorized client.
     */
    function getNewToken(oAuth2Client, callback) {
      const authUrl = oAuth2Client.generateAuthUrl({
        access_type: 'offline',
        scope: SCOPES,
      });
      console.log('Authorize this app by visiting this url:', authUrl);
      const rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout,
      });
      rl.question('Enter the code from that page here: ', (code) => {
        rl.close();
        oAuth2Client.getToken(code, (err, token) => {
          if (err) return console.error('Error retrieving access token', err);
          oAuth2Client.setCredentials(token);
          // Store the token to disk for later program executions
          fs.writeFile(TOKEN_PATH, JSON.stringify(token), (err) => {
            if (err) return console.error(err);
            console.log('Token stored to', TOKEN_PATH);
          });
          callback(oAuth2Client);
        });
      });
    }

    /**
     * Lists the labels in the user's account.
     *
     * @param {google.auth.OAuth2} auth An authorized OAuth2 client.
     */
    async function getMessage(auth) {
      speechText = await resolveMessage();
      console.log(`Speechtext in async function: ${speechText}`);
      function resolveMessage() {
        return new Promise((resolve, reject) => {
          const gmail = google.google.gmail({version: 'v1', auth});
          gmail.users.messages.list({
            userId: 'me',
          }, async (err, res) => {
            console.log(`Error: ${err}`);
            if(err) {
              reject(err);
              return;
            }
            let message = res.data.messages[0];
            console.log(`Messages: ${res.data.messages}`);
            console.log(`Id: ${message.id}`);

//
// THIS IS UNDEFINED:
//


            let messageBody = await gmail.users.messages.get({id: message.id, userId: 'me'});
            console.log(messageBody.data.snippet);
            resolve(messageBody.data.snippet);
          });
        })
      }
    }

    return handlerInput.responseBuilder
      .speak(speechText)
      .reprompt(speechText)
      .withSimpleCard('Hello World', speechText)
      .getResponse();
  },
};

const ErrorHandler = {
  canHandle() {
    return true;
  },
  handle(handlerInput, error) {
    console.log(`Error handled: ${error.message}`);

    return handlerInput.responseBuilder
      .speak('Sorry, I can\'t understand the command. Please say again.')
      .reprompt('Sorry, I can\'t understand the command. Please say again.')
      .getResponse();
  },
};

const skillBuilder = Alexa.SkillBuilders.custom();

exports.handler = skillBuilder
  .addRequestHandlers(
    LaunchRequestHandler,
  )
  .addErrorHandlers(ErrorHandler)
  .lambda();

因此,我能够通过电子邮件ID获得ID-S,而不是消息正文。当我在计算机上运行单个nodejs应用程序时,这非常完美。 也在Linux Mint和Windows 10上进行了尝试,两者均能很好地工作-但在AWS上却无法使用。

有什么原因会导致这种情况吗?

0 个答案:

没有答案