- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
使用googleapi时出错
我的错误:
(node:7776) UnhandledPromiseRejectionWarning: TypeError: Cannot destructure property
data
of 'undefined' or 'null'. at gmail.users.labels.list
令我困惑的是,一切正常,它按应有的方式打印出来,但如果它显然不是,为什么它会给我一个关于为 null 的错误?怎么解决这个问题?
这是我的代码:
var async = require('async-kit');
const fs = require('fs');
const readline = require('readline');
const {
google
} = require('googleapis');
const SCOPES = ['https://www.googleapis.com/auth/gmail.readonly'];
const TOKEN_PATH = 'credentials.json';
function test(methodname) {
console.log('called');
fs.readFile('client_secret.json', (err, content) => {
if (err) return console.log('Error loading client secret file:', err);
// Authorize a client with credentials, then call the Google Sheets API.
authorize(JSON.parse(content), methodname);
});
}
/**
* 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) {
console.log('authorized');
const {
client_secret,
client_id,
redirect_uris
} = credentials.installed;
const oAuth2Client = new 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 callback(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.
*/
function listLabels(auth, callback) {
const gmail = google.gmail({
version: 'v1',
auth
});
gmail.users.labels.list({
userId: 'me',
}, (err, {
data
}) => {
if (err) {
console.log('The API returned an error: ' + err);
callback();
}
const labels = data.labels;
console.log('got labels');
if (labels.length) {
interimlabels = labels;
interimlabels.forEach((label) => {
console.log(`- ${label.name}`);
});
callback();
}
else {
console.log('No labels found.');
callback();
}
});
}
var interimlabels = [];
async.series([
function getStuff(callback) {
test(listLabels);
if (interimlabels.length != 0) {
console.log('labels', interimlabels);
callback();
}
}
])
.exec(function(error, results) {
if (error) {
console.log('shit');
}
else {
console.log('done');
}
});
编辑:我只是想补充一点,它完美地工作,按应有的方式注销,但在最后给了我错误之后edit2:好的,如果我删除回调();来自列表标签();然后promiserejection消失了,但是代码显然会卡在那里,那么回调可能有什么问题呢?
最佳答案
//您收到一个错误,并且错误处理中出现了一些错误。你破坏了谷歌 API 的结果。但实际上您没有得到任何结果,因此它显示了给定的错误:Cannot destructory property error - googleapi
//试试这个代码。
/**
* Lists the labels in the user's account.
*
* @param {google.auth.OAuth2} auth An authorized OAuth2 client.
*/
function listLabels(auth, callback) {
const gmail = google.gmail({
version: 'v1',
auth
});
gmail.users.labels.list({
userId: 'me',
}, (err, result) => {
if (err || !result) {
console.log('The API returned an error: ' + err);
callback();
} else {
const labels = result.data.labels;
console.log('got labels');
if (labels.length) {
interimlabels = labels;
interimlabels.forEach((label) => {
console.log(`- ${label.name}`);
});
callback();
}
else {
console.log('No labels found.');
callback();
}
}
});
}
希望这能解决您的疑问。
更新的代码:
function listLabels(auth, callback) {
const gmail = google.gmail({
version: 'v1',
auth
});
var request = gmail.users.labels.list({
'userId': 'me'
});
request.execute(function(resp) {
console.log("resp", resp);
var labels = resp.labels;
callback(labels);
});
}
关于node.js - 无法解构属性错误 - googleapi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50563860/
我在寻找有关 JavaScript 解构的信息,并在 Packt Publication 的视频系列中找到了视频“解构赋值”。在视频的一开始,我看到了以下代码: var [a, b] = [1,2,3
知识渊博的人可以帮助我理解 Scalaz 的工作原理吗?和 co.有效吗?我是 Scalaz 的新手,有点迷失在探索中。 我想做的是在 List 中累积错误,例如 (v0 v1) foldLeft
Haskell 中的模式匹配可以用这种方式解构数字吗: f (n + 1) = n 我期望 ex 的前身:f 6 = 5、f 5 = 4 等。 我在这里找到了这种模式匹配用法: https://wik
我有一个与此类似的文件: const COLORS = { PRIMARY_COLOR: 'red', SECONDARY_COLOR: 'green' }; const APP = {
作为对 SO 问题的回答,我构建了一个循环函数,并构建了我迄今为止最复杂的解构,这奇迹般地起作用了: (defn fib? [a b & [c & r]] (if (= c (+ a b))
我对破坏感到困惑。 我在其中使用了 React,我们这样做了 const [ books, setBooks ] = useState([{a:'v'}] 和 const {books} = useC
我确定这在某个地方得到了回答,但我缺乏制定搜索的词汇。 #include class Thing { public: int value; Thing(); virtual ~Thing()
如果我在 javascript 中有这样一个对象: let obj = {b: 3, c: 4, d: 6} 如果我解构它,我可以很容易地得到不同的部分,例如,如果我这样做,我可以得到 c 和 d:
这个问题在这里已经有了答案: One-liner to take some properties from object in ES 6 (11 个回答) 2年前关闭。 我似乎不记得如何写这个解构模式
我有一个函数可以查询我的数据库中最近的 X 个条目,它返回一个 map 向量,如下所示: [{:itemID "item1" :category "stuff" :price 5} {:itemI
根据所选语言,我需要销毁对象并获得所需的值。 我该怎么做才能不破坏整个对象? const translate = { "navMenu1": { "en": "Menu 1",
我试图理解这种 ES6 解构。有人可以解释这行代码将编译成什么吗? const { loading, route: { pageName = 'default' } = {} } = this.pro
我有一个程序,可以输出这样的一些条件(这是实际输出,它是伪代码): if ( first occurance of 'AB' -0.5 ) * (( number of products viewe
Serilog的@的目的是什么?句法? 如果我运行以下命令: var dummy = new { Foo = "Bar", Date = DateTime.Now }; Log.Information
JSON 编码的数组从 PHP 传递到 HTML 文档。目前还不清楚如何将该数组解构为 javascript 可用的片段。例如,考虑以下 HTML: {"foo":[{"id":1},{"id":3}
我正在 Chrome 的控制台选项卡中尝试使用以下代码进行 JavaScript 解构,这给了我未捕获的语法错误:标识符“a”已被声明异常 o = { a: "foo", b: 12, c: "bar
我有一个 JavaSCript 对象 person,其中包含 id、name、phone 和 地址属性。我想修改属性名称并将它们放入新对象 personData 中。这可以一步完成吗?: 第 1 步(
有没有办法从 WPF 中获取 Geometry 实例的内部结构? 我需要转换一串用户输入的几何数据,例如 M10,100 C10,300 300,-200 300,100 Z 用于分离几何命令(移动、
我的代码中有一个 promise : req.getValidationResult() .then(result => { let errors = resu
我正在为 Apollo Client 生成 Flow 类型,我目前有这个: type FetchModuleQuery = {| // Fetch single module module:
我是一名优秀的程序员,十分优秀!