nodeJS 与 Google API 异步等待

Nil*_*ubi 1 backend google-calendar-api google-api node.js server

我正在使用 Google Calendar 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)
  }
})
Run Code Online (Sandbox Code Playgroud)

我的 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
  });
}
Run Code Online (Sandbox Code Playgroud)

listEvents 方法工作正常,但该函数的返回始终未定义,因为它不等待我从 Calendar API 返回的响应。

有谁知道这个问题的解决方案?

Soh*_*raf 5

你不能像在函数async中返回一样从函数中返回listEvents,它总是会返回undefined

解决方案: 可以将代码包装在a中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)
    });
  });
}
Run Code Online (Sandbox Code Playgroud)