Lambda restituendo 200 con oggetto vuoto, non wiatiing per il richiamo al fuoco

voti
25

Sto colpendo il calendario di google api, e ho un setup lambda in un asny try catch. Ho provato ad aggiungere l'attesa ad ogni funzione, ho provato a spostare il ritorno a dopo l'if(err) ma questo mi dà un 500. Quello che devo fare è passare i dati dell'array dalla funzione google calendar api al messaggio in modo da poterlo ottenere nel mio front end. Ecco il lambda finora. Qualsiasi aiuto sarebbe molto apprezzato. Grazie


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

Questo è il recupero che sto facendo per esso sul fronte e restituisce un oggetto vuoto

const IndexPage = () => {
  fetch(/functions/list-calendar)
    .then(response => response.json())
    .then(response => {
      console.log(response)
    })
È pubblicato 17/05/2020 alle 20:06
fonte dall'utente
In altre lingue...                            


1 risposte

voti
0

Mi sembra che lei stia rispondendo prima che il richiamo sia stato eseguito. Se non avete familiarità asynce await, dovreste leggere questa documentazione. Fondamentalmente dovete aspettare che il callback avvenga prima di tornare, e potete farlo usando le funzioni di callback, .then chains o le funzioni di async

Ho anche notato nel vostro codice che chiamate il callback ogni volta che fate un push in array. Penso che sia più semplice spingere tutti gli elementi arraye poi richiamare l'array

Piuttosto che fare un push nella mappa (il che confonde), questo restituisce un nuovo array di event.start.dateTime e perché se (start >= firstDay && end <= lastDay)è falso, aggiunge un a nullall'array, quindi .filter(x => Boolean(x));li filtra in modo da ottenere solo un array di datetime.

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

Versione semplice

Potresti spostare il tuo ritorno nel callback.

listEvents(function (eventList) {
  array = eventList;

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

Versione promessa

Il mio nodo è un po' arrugginito, ma potresti cambiare il tuo metodo per restituire una promessa.

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

e poi, visto che stai già usando l'async,

id="pre-3
Risposto il 23/05/2020 a 15:33
fonte dall'utente

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