使用节点js创建Google电子表格

时间:2017-03-27 17:48:05

标签: node.js google-oauth google-api-client google-sheets-api alexa-skills-kit

我想在我的alexa技能中创建一个google文档表,这是用Node.js编写的。我启用了谷歌API,我在亚马逊开发门户网站设置了所需的范围,我实际上可以登录到谷歌帐户(所以发布的代码的前几行似乎工作),我没有得到任何错误消息。但是永远不会创建工作表。

现在主要的问题是,是否有人可以在我的代码中看到问题。

但我还有一个额外的问题我会非常感兴趣:因为我使用帐户链接,我不能在Alexa测试模拟器中尝试该代码,但必须在运行之前将其上传到Alexa,我可以没有得到任何调试消息。如何以这种方式进行最佳调试?

if (this.event!== undefined)
{
 if (this.event.session.user.accessToken === undefined) 
 {
    this.emit(':tellWithLinkAccountCard','to start using this skill, please use the companion app to authenticate on Google');
    return;
  }
}
else
{

    this.emit(':tellWithLinkAccountCard','to start using this skill, please use the companion app to authenticate on Google');
    return;
}
var oauth2Client = new google.auth.OAuth2('***.apps.googleusercontent.com', '***', '***');

oauth2Client.setCredentials({
     access_token: this.event.session.user.accessToken,
     refresh_token: this.event.session.user.refreshToken
});

var services = google.sheets('v4');
services.spreadsheets.create({
  resource : {properties:{title:"MySheet"}},
  auth       : oauth2Client
}, function(err,response) {
  if( err ) {
    console.log('Error : unable to create file, ' + err);
    return;
  } else {
    console.dir(response);
  }
});

编辑:我手动尝试了下半部分,可以创建一个电子表格。所以问题似乎确实是用“this.event.session.user.accessToken”检索访问令牌。

1 个答案:

答案 0 :(得分:2)

我发现使用单元测试来调试这样的问题要容易得多。这允许在本地重新运行代码。我使用NPM和Mocha,它可以更容易地调试自定义和智能家居技能。网上有很多关于如何使用NPM和Mocha来测试Nodejs代码的信息,所以我在此不再重复。例如,请参阅Big Nerd Ranch article。这使得最初设置项目变得有点复杂,但是每次遇到错误都会让你感到高兴。

在这个例子中,我将代码分成两半:

  1. 前半部分将处理来自Alexa的请求并提取令牌。
  2. 下半部分将使用令牌创建Google文档。我也会传递要创建的文档的名称。
  3. 我会首先测试第二部分,传入一个有效的令牌(仅用于测试)和一个测试文档名称。当它工作时,至少你知道文档创建代码是有效的,任何问题都必须与令牌或你如何得到它。

    一旦有效,我会为第一部分创建一个测试。 我希望我们将一个硬编码的JSON对象作为'event'传入,将event.session.user.accesToken设置为第一个测试中使用的工作测试令牌:

    'use strict';
    
    var token = '<valid token obtained from google account>';
    
    let testEvent = {
      'session': {
        'user': {
          'accessToken':  token
        }
      }
    }