Lambda die 200 met leeg voorwerp terugkeert, niet om terug te bellen naar het vuur

stemmen
-1

Ik ben het raken van de google kalender api, en ik heb een lambda setup in asny proberen te vangen. Ik heb geprobeerd om wacht aan elke functie toe te voegen, probeerde de terugkeer naar na de if(err) te verplaatsen, maar dat geeft me een 500. Wat ik moet doen is de array data van de google kalender api functie doorgeven aan het bericht zodat ik het in mijn front-end kan krijgen. Hier is de lambda tot nu toe. Elke hulp zou zeer op prijs worden gesteld. Bedankt


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

Dit is het halen van een leeg object dat ik aan de voorkant doe en het geeft een leeg object terug

const IndexPage = () => {
  fetch(/functions/list-calendar)
    .then(response => response.json())
    .then(response => {
      console.log(response)
    })
De vraag is gesteld op 17/05/2020 om 20:06
bron van user
In andere talen...                            


1 antwoorden

stemmen
0

Het lijkt me dat je je antwoord terugstuurt voordat de callback is uitgevoerd. Als je niet bekend bent met asyncen await, moet je deze documentatie lezen. In principe moet u wachten tot de callback is uitgevoerd voordat u terugkeert, en u kunt dit doen met behulp van callback-functies, .dan ketens of async-functies

Ik heb ook gemerkt in je code dat je de callback belt elke keer als je een duwtje in de rug doet. Ik denk dat het eenvoudiger is om al je items in arrayte duwen en dan de array terug te bellen

In plaats van een duwtje in de kaart (wat verwarrend is), geeft dit een nieuwe reeks event.start.dateTime terug en omdat als (start >= firstDay && end <= lastDay)het vals is, voegt het een nullaan de reeks toe, dus .filter(x => Boolean(x));filtert het ze uit, zodat je gewoon een reeks van datetimes krijgt.

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

Eenvoudige versie

Je zou je terugkeer kunnen verplaatsen naar de callback.

listEvents(function (eventList) {
  array = eventList;

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

Beloftevolle versie

Mijn knoop is een beetje verroest, maar je zou je methode kunnen veranderen om een belofte terug te doen.

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

en dan, aangezien je al gebruik maakt van async,

id="pre-3"
antwoordde op 23/05/2020 om 15:33
bron van user

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