【问题标题】:Create google spreadsheet with node js使用节点 js 创建谷歌电子表格
【发布时间】:2017-03-27 17:48:05
【问题描述】:

我想在我的 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" 检索访问令牌。

【问题讨论】:

  • this.event.session.user.accessToken 来自哪里?这闻起来有点像您在使用服务帐户?
  • 这是由亚马逊alexa接口提供的账户链接。我认为我没有使用服务帐户。
  • 您是否有 http 请求/响应来查看它是否返回 200 或某种错误?
  • 不幸的是,我不知道如何获得这些,因为我必须通过 alexa 运行脚本,才能访问 amazon api 提供给我的访问令牌。
  • 代码实际上似乎工作。我在代码下方的一个错误命令是实际问题。

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


【解决方案1】:

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

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

  1. 前半部分将处理来自 Alexa 的请求并提取令牌。
  2. 后半部分将使用令牌创建 Google 文档。我还会传递要创建的文档的名称。

我将首先测试第二部分,传入一个有效的令牌(仅用于测试)和一个测试文档名称。当它工作时,至少你会知道文档创建代码正在工作,任何问题都必须与令牌或你如何获取它有关。

一旦成功,我将为第一部分创建一个测试。 我会给我们一个硬编码的 JSON 对象作为“事件”传入,并将 event.session.user.accesToken 设置为第一个测试中使用的工作测试令牌:

'use strict';

var token = '<valid token obtained from google account>';

let testEvent = {
  'session': {
    'user': {
      'accessToken':  token
    }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-30
    • 2017-04-28
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多