nodeJS 异步等待 Google API
nodeJS async await with Google API
我正在使用 Google 日历 API,它按预期工作。但是我对那里的异步方法有疑问。
所以我有以下请求路由来从我的特定用户获取所有事件:
router.get('/api/user/calendar/listEvents', async (req, res) => {
try {
const token = "123456789"
var oAuth = authorizationHelper(token)
var events = await listEvents(oAuth, req.body.date)
res.status(200).send(events)
} catch (e) {
res.status(400).send("Error Bad Request")
console.log(e)
}
})
还有我的 listEvents 方法:
async function listEvents(auth, date) {
var events;
const calendar = google.calendar({ version: 'v3', auth });
const eventsA = calendar.events.list({
calendarId: 'primary',
timeMin: date,
maxResults: 1,
singleEvents: true,
orderBy: 'startTime',
}, (err, res) => {
if (err) return console.log('The API returned an error: ' + err);
events = res.data.items;
return events
});
}
listEvents 方法工作正常,但此函数的 return 始终未定义,因为它不等待我从日历 API 返回的响应。
有人知道这个问题的解决方案吗?
您不能从 async
函数中 return,因为您在 listEvents
函数中 return,它将始终 return undefined
;
解法:
您可以将代码包装在 promise
中,然后在 resolve
方法中传递数据。
工作示例:
async function listEvents(auth, date) {
var events;
const calendar = google.calendar({ version: 'v3', auth });
return new Promise((resolve, reject) => {
const eventsA = calendar.events.list({
calendarId: 'primary',
timeMin: date,
maxResults: 1,
singleEvents: true,
orderBy: 'startTime',
}, (err, res) => {
if (err) {
console.log('The API returned an error: ' + err);
reject('The API returned an error: ' + err);
return;
}
events = res.data.items;
resolve(events)
});
});
}
我建议等待 calendar.events.list
:
async function listEvents(auth, date) {
var events;
const calendar = google.calendar({ version: "v3", auth });
try {
const res = await calendar.events.list({
calendarId: "primary",
timeMin: date,
maxResults: 1,
singleEvents: true,
orderBy: "startTime",
});
events = res.data.items;
return events;
} catch (err) {
console.log("The API returned an error: " + err);
}
}
我正在使用 Google 日历 API,它按预期工作。但是我对那里的异步方法有疑问。
所以我有以下请求路由来从我的特定用户获取所有事件:
router.get('/api/user/calendar/listEvents', async (req, res) => {
try {
const token = "123456789"
var oAuth = authorizationHelper(token)
var events = await listEvents(oAuth, req.body.date)
res.status(200).send(events)
} catch (e) {
res.status(400).send("Error Bad Request")
console.log(e)
}
})
还有我的 listEvents 方法:
async function listEvents(auth, date) {
var events;
const calendar = google.calendar({ version: 'v3', auth });
const eventsA = calendar.events.list({
calendarId: 'primary',
timeMin: date,
maxResults: 1,
singleEvents: true,
orderBy: 'startTime',
}, (err, res) => {
if (err) return console.log('The API returned an error: ' + err);
events = res.data.items;
return events
});
}
listEvents 方法工作正常,但此函数的 return 始终未定义,因为它不等待我从日历 API 返回的响应。
有人知道这个问题的解决方案吗?
您不能从 async
函数中 return,因为您在 listEvents
函数中 return,它将始终 return undefined
;
解法:
您可以将代码包装在 promise
中,然后在 resolve
方法中传递数据。
工作示例:
async function listEvents(auth, date) {
var events;
const calendar = google.calendar({ version: 'v3', auth });
return new Promise((resolve, reject) => {
const eventsA = calendar.events.list({
calendarId: 'primary',
timeMin: date,
maxResults: 1,
singleEvents: true,
orderBy: 'startTime',
}, (err, res) => {
if (err) {
console.log('The API returned an error: ' + err);
reject('The API returned an error: ' + err);
return;
}
events = res.data.items;
resolve(events)
});
});
}
我建议等待 calendar.events.list
:
async function listEvents(auth, date) {
var events;
const calendar = google.calendar({ version: "v3", auth });
try {
const res = await calendar.events.list({
calendarId: "primary",
timeMin: date,
maxResults: 1,
singleEvents: true,
orderBy: "startTime",
});
events = res.data.items;
return events;
} catch (err) {
console.log("The API returned an error: " + err);
}
}