Лямбда возвращает 200 с пустым предметом, не желая возвращаться на огонь

голоса
25

Я захожу в календарь Google api, и у меня есть настройка лямбда в качестве смешной попытки поймать. Я пытался добавить ожидание в каждую функцию, пытался переместить возвращение после if(err), но это дает мне 500. Что мне нужно сделать, так это передать данные массива из функции календаря google api в сообщение, чтобы я мог получить их в свой передний конец. Вот лямбда на данный момент. Мы будем очень признательны за любую помощь. Спасибо


const { google } = require(googleapis)
const { OAuth2 } = google.auth
const faunadb = require(faunadb) /* Import faunaDB sdk */

// Docs on event and context https://www.netlify.com/docs/functions/#the-handler-method
exports.handler = async (event, context) => {
  try {
    const OAuth2Client = new OAuth2(
      FDSAF,
      FDSAF
    )

    // Connect to the database
    const q = faunadb.query
    const client = new faunadb.Client({
      secret: FDSAFA,
    })

    let refreshToken

    await client
      .query(q.Get(q.Ref(q.Collection(AuthUrl), fdsa)))
      .then(ret => (refreshToken = ret.data.title.refresh_token))

    console.log(refreshToken)

    OAuth2Client.setCredentials({
      refresh_token: refreshToken,
    })

    // Create a new calender instance.
    const calendar = google.calendar({ version: v3, auth: OAuth2Client })



    let ok
    function listEvents(callback) {
      let array = []

      calendar.events.list(
        {
          calendarId: primary,
          // timeMin: new Date().toISOString(),
          maxResults: 100000,
          singleEvents: true,
          orderBy: startTime,
        },
        (err, res) => {
          if (err) return console.log(The API returned an error:  + err)

          var date = new Date()
          var firstDay = new Date(date.getFullYear(), date.getMonth(), 1)
          var lastDay = new Date(date.getFullYear(), date.getMonth() + 1, 0)

          //console.log(res.data.items)
          const events = res.data.items
          if (events.length) {
            //   console.log(Upcoming 10 events:)
            events.map((event, i) => {
              const start = new Date(event.start.dateTime || event.start.date)
              const end = new Date(event.end.dateTime || event.end.date)

              if (start >= firstDay && end <= lastDay) {
                console.log(start, end, event.summary)
                //ok = test
                array.push(start)
                callback(array)
              }

              //     const start = event.start.dateTime || event.start.date
              //     console.log(`${start} - ${event.summary}`)
            })
          } else {
            console.log(No upcoming events found.)
          }
        }
      )
    }

    let array

    listEvents(function (eventList) {
      array = eventList
    })



    return {
      statusCode: 200,
      body: JSON.stringify({ message: array }),
      // // more keys you can return:
      // headers: { headerName: headerValue, ... },
      // isBase64Encoded: true,
    }
  } catch (err) {
    return { statusCode: 500, body: err.toString() }
  }
}

Это то, что я делаю для него на передней стороне, и он возвращает пустой объект

const IndexPage = () => {
  fetch(/functions/list-calendar)
    .then(response => response.json())
    .then(response => {
      console.log(response)
    })
Задан 17/05/2020 в 20:06
источник пользователем
На других языках...                            


1 ответов

голоса
0

Похоже, ты возвращаешь свой ответ до того, как будет выполнен обратный вызов. Если вы не знакомы asyncиawait, вы должны прочитать эту документацию. В основном, вам нужно подождать, пока произойдет обратный вызов, прежде чем вы вернетесь, и вы можете сделать это либо с помощью функций обратного вызова, либо с помощью цепочек, либо с помощью асинхронных функций

Я также заметил в вашем коде, что вы вызываете обратный вызов каждый раз, когда делаете нажатие на массив. Я думаю, что проще вставить все ваши элементы в arrayмассив, а затем вызвать его обратный вызов

Вместо того, чтобы нажимать на карту (что сбивает с толку), он возвращает новый массив event.start.dateTime, а если (start >= firstDay && end <= lastDay)он ложный, то добавляет его nullв массив, поэтому .filter(x => Boolean(x));фильтрует их, так что вы просто получаете массив дат.

let array = events.map((event, i) => {
    const start = new Date(event.start.dateTime || event.start.date)
    const end = new Date(event.end.dateTime || event.end.date)

    if (start >= firstDay && end <= lastDay) {
      return start;
    else
      return null;

      //     const start = event.start.dateTime || event.start.date
      //     console.log(`${start} - ${event.summary}`)
    })
    .filter(x => Boolean(x));

Простая версия

Ты можешь перенести свое возвращение на обратный вызов.

listEvents(function (eventList) {
  array = eventList;

  return {
    statusCode: 200,
    body: JSON.stringify({ message: array }),
    // // more keys you can return:
    // headers: { "headerName": "headerValue", ... },
    // isBase64Encoded: true,
  }
});

Версия для обещаний

Мой узел немного заржавел, но вы можете изменить свой метод, чтобы вернуть обещание.

function listEvents(callback) {
  return new Promise((resolve, reject) => {


    calendar.events.list(
    {
      calendarId: "primary",
      // timeMin: new Date().toISOString(),
      maxResults: 100000,
      singleEvents: true,
      orderBy: "startTime",
    },
    (err, res) => {
      if (err) reject("The API returned an error: " + err));

      var date = new Date()
      var firstDay = new Date(date.getFullYear(), date.getMonth(), 1)
      var lastDay = new Date(date.getFullYear(), date.getMonth() + 1, 0)

      //console.log(res.data.items)
      const events = res.data.items
      if (events.length) {
        //   console.log("Upcoming 10 events:")
        let array = events.map((event, i) => {
          const start = new Date(event.start.dateTime || event.start.date)
          const end = new Date(event.end.dateTime || event.end.date)

          if (start >= firstDay && end <= lastDay) {
            return start;
          else
            return null;

          //     const start = event.start.dateTime || event.start.date
          //     console.log(`${start} - ${event.summary}`)
        }).filter(x => Boolean(x));

        resolve(array);
      } else {
        resolve([]);
      }
    })
  });
}

а потом, раз уж ты уже используешь асинхронизацию,

id="до-3"
Ответил 23/05/2020 в 15:33
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more