Lambda returnerte 200 med tom gjenstand, og vil ikke etter tilbakering til brann

stemmer
25

Jeg treffer google-kalenderen api, og jeg har et lambda-oppsett i en prøve. Jeg har prøvd å legge til avvente til hver funksjon, prøvd å flytte tilbake til etter if (feil), men det gir meg en 500. Det jeg trenger å gjøre er å overføre matrisedataene fra google-kalender-api-funksjonen til meldingen slik at jeg kan få det i fronten min. Her er lambda så langt. All hjelp vil bli satt stor pris på. Takk


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

Dette er hentingen jeg gjør for det i frontenden, og den returnerer et tomt objekt

const IndexPage = () => {
  fetch(/functions/list-calendar)
    .then(response => response.json())
    .then(response => {
      console.log(response)
    })
Publisert på 17/05/2020 klokken 20:06
kilden bruker
På andre språk...                            


1 svar

stemmer
0

Det ser ut til at du returnerer svaret ditt før tilbakeringingen er utført. Hvis du ikke er kjent med det async og await , bør du lese denne dokumentasjonen . I utgangspunktet må du vente på at tilbakeringingen skal skje før du kommer tilbake, og du kan enten gjøre dette ved hjelp av tilbakeringingsfunksjoner, deretter kjeder eller asyncfunksjoner.

Jeg la også merke til i koden din at du ringer tilbakeringingen hver gang du gjør et innkast. Jeg tror at det er enklere å skyve inn alle varene dine array og deretter tilbakering av matrisen.

I stedet for å trykke på kartet (som er forvirrende), returnerer dette et nytt utvalg av event.start.dateTime og fordi hvis (start >= firstDay && end <= lastDay) er falsk, legger den til null til matrisen, altså .filter(x => Boolean(x)); filtrerer dem ut slik at du bare får en rekke datatider.

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

Enkel versjon

Du kan flytte tilbake til tilbakeringingen.

listEvents(function (eventList) {
  array = eventList;

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

Lovende versjon

Noden min er litt rusten, men du kan endre metoden din for å gi et løfte.

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

og siden du allerede bruker async,

let array = await listEvents();
Svarte 23/05/2020 kl. 15:33
kilden bruker

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