Lambda devolvendo 200 com o objeto vazio, e não com a intenção de chamar de volta ao fogo

votos
25

Estou a aceder ao calendário do google api, e tenho uma configuração lambda num asny try catch. Eu tentei adicionar espera a cada função, tentei mover o retorno para depois do if(err) mas isso me dá um 500. O que eu preciso fazer é passar os dados do array da função api do calendário do google para a mensagem para que eu possa obtê-lo no meu front end. Aqui está a lambda até agora. Qualquer ajuda seria muito apreciada. Obrigado


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

Este é o fetch que estou a fazer para ele na parte da frente e ele devolve um objecto vazio

const IndexPage = () => {
  fetch(/functions/list-calendar)
    .then(response => response.json())
    .then(response => {
      console.log(response)
    })
Publicado 17/05/2020 em 20:06
fonte usuário
Em outras línguas...                            


1 respostas

votos
0

Parece-me que você está retornando sua resposta antes da chamada de retorno ter sido executada. Se você não está familiarizado com asynce await, você deve ler esta documentação. Basicamente você precisa esperar que a callback aconteça antes de retornar, e você pode fazer isso usando as funções de callback, .então correntes ou funções async

Também notei no teu código que estás a chamar a chamada de volta sempre que estás a fazer um "push into array". Acho que é mais simples empurrar todos os seus itens para dentro arraye depois chamar de volta a matriz

Ao invés de fazer um push no mapa (que é confuso), isso retorna um novo array de event.start.dateTime e porque se (start >= firstDay && end <= lastDay)for falso, ele adiciona um nullao array, então .filter(x => Boolean(x));filtra-os para que você obtenha um array de datas/horas.

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

Versão simples

Podias mudar o teu regresso para a chamada de retorno.

listEvents(function (eventList) {
  array = eventList;

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

Versão Prometida

Meu nódulo está um pouco enferrujado, mas você poderia mudar seu método para devolver uma 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 depois, como já estás a usar o async,

id="pré-3"
Respondeu 23/05/2020 em 15:33
fonte usuário

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