Lambda renvoyant 200 avec un objet vide, sans attendre le rappel au feu

voix
25

Je suis en train de consulter l'api du calendrier de Google et j'ai une configuration lambda dans un asny try catch. J'ai essayé d'ajouter await à chaque fonction, j'ai essayé de déplacer le retour à après le if(err) mais cela me donne un 500. Ce que je dois faire, c'est passer les données du tableau de la fonction api du calendrier google au message pour que je puisse l'obtenir dans mon front end. Voici le lambda jusqu'à présent. Toute aide serait très appréciée. Merci


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

C'est la recherche que je fais pour lui sur le front et il retourne un objet vide

const IndexPage = () => {
  fetch(/functions/list-calendar)
    .then(response => response.json())
    .then(response => {
      console.log(response)
    })
Créé 17/05/2020 à 20:06
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
0

Il me semble que vous retournez votre réponse avant que le rappel n'ait été exécuté. Si vous ne connaissez pas asyncet await, vous devriez lire cette documentation. En principe, vous devez attendre que le rappel soit effectué avant de revenir, et vous pouvez le faire en utilisant les fonctions de rappel, puis les chaînes ou les fonctions asynchrones

J'ai également remarqué dans votre code que vous appelez le callback chaque fois que vous faites un push dans un tableau. Je pense qu'il est plus simple de pousser tous vos éléments dans le tableau arrayet de le rappeler

Plutôt que de faire un push dans la carte (ce qui est déroutant), cela renvoie un nouveau tableau de event.start.dateTime et parce que si (start >= firstDay && end <= lastDay)c'est faux, il ajoute un nullau tableau, donc les .filter(x => Boolean(x));filtre pour que vous obteniez juste un tableau de dates-heures.

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

Version simple

Vous pourriez déplacer votre retour dans le rappel.

listEvents(function (eventList) {
  array = eventList;

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

Version Promise

Mon nœud est un peu rouillé, mais vous pourriez changer de méthode pour me rendre une promesse.

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

et ensuite, puisque vous utilisez déjà l'asynchronisation,

id="pre-3"
Créé 23/05/2020 à 15:33
source utilisateur

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