Lambda powracająca 200 z pustym obiektem, nie wijąca się w celu odwołania się do ognia

głosy
25

Uderzyłem w kalendarz google api, i mam lambda setup w asny try catch. Próbowałem dodać czekanie do każdej funkcji, próbowałem przenieść powrót do po if(err), ale to daje mi 500. To, co muszę zrobić, to przekazać tablicę danych z funkcji google calendar api do wiadomości, więc mogę dostać go w mojej przedniej części. Tutaj jest lambda jak na razie. Jakakolwiek pomoc byłaby bardzo mile widziana. Dzięki


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() }
  }
}

To jest aport, który robię dla niego na froncie i zwraca pusty obiekt

const IndexPage = () => {
  fetch(/functions/list-calendar)
    .then(response => response.json())
    .then(response => {
      console.log(response)
    })
Utwórz 17/05/2020 o 20:06
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
0

Wygląda na to, że zwracasz swoją odpowiedź przed wykonaniem wywołania zwrotnego. Jeśli nie jesteś zaznajomiony asynci awaitpowinieneś przeczytać tę dokumentację. Zasadniczo musisz poczekać na wywołanie zwrotne przed powrotem i możesz to zrobić za pomocą funkcji wywołania zwrotnego, a następnie funkcji łańcuchowych lub asynchronicznych

Zauważyłem też w twoim kodzie, że dzwonisz na wezwanie za każdym razem, gdy robisz pchnięcie do tablicy. Myślę, że prościej jest wcisnąć wszystkie swoje elementy do tablicy, arraya następnie oddzwonić do niej

Zamiast naciskać na mapę (co jest mylące), to zwraca nową tablicę event.start.dateTime, a ponieważ jeśli (start >= firstDay && end <= lastDay)jest fałszywa, to dodaje nulldo tablicy, więc .filter(x => Boolean(x));odfiltrowuje je, więc po prostu otrzymasz tablicę datetimes.

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));

Prosta wersja

Mógłbyś przenieść swój powrót na odwrót.

listEvents(function (eventList) {
  array = eventList;

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

Wersja obietnicowa

Mój węzeł jest trochę zardzewiały, ale możesz zmienić metodę, by zwrócić obietnicę.

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([]);
      }
    })
  });
}

a następnie, ponieważ używasz już asynchronizacji,

id="pre-3"
Odpowiedział 23/05/2020 o 15:33
źródło użytkownik

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