Lambda kehrt 200 mit leerem Objekt zurück und wartet nicht auf einen Rückruf

stimmen
25

Ich treffe die Google-Kalender-API, und ich habe ein Lambda-Setup in einem Asny Try Catch. Ich habe versucht, jeder Funktion Wait hinzuzufügen, habe versucht, die Rückkehr nach dem if(err) zu verschieben, aber das gibt mir eine 500. Was ich tun muss, ist, die Array-Daten von der Google-Kalender-api-Funktion an die Nachricht zu übergeben, damit ich sie in meinem Frontend erhalten kann. Hier ist das bisherige Lambda. Jede Hilfe wäre sehr willkommen. Danke


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

Dies ist der Fetch, den ich dafür am Frontend mache, und er gibt ein leeres Objekt zurück

const IndexPage = () => {
  fetch(/functions/list-calendar)
    .then(response => response.json())
    .then(response => {
      console.log(response)
    })
Veröffentlicht am 17/05/2020 um 20:06
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
0

Für mich sieht es so aus, dass Sie Ihre Antwort zurückgeben, bevor der Rückruf ausgeführt worden ist. Wenn Sie mit asyncund awaitnicht vertraut sind, sollten Sie diese Dokumentation lesen. Grundsätzlich müssen Sie warten, bis der Rückruf erfolgt ist, bevor Sie zurückkehren, und Sie können dies entweder mit Callback-Funktionen, .then-Ketten oder async-Funktionen tun

Mir ist in Ihrem Code auch aufgefallen, dass Sie den Rückruf jedes Mal aufrufen, wenn Sie einen Push in das Array machen. Ich denke, dass es einfacher ist, alle Ihre Elemente in das Array zu schieben arrayund dann den Rückruf durchzuführen

Anstatt einen Push in der Karte zu machen (was verwirrend ist), gibt dies ein neues Array mit event.start.dateTime zurück, und weil es, wenn (start >= firstDay && end <= lastDay)es falsch ist, ein a nullzu dem Array hinzufügt, .filter(x => Boolean(x));filtert es sie also heraus, so dass Sie nur ein Array mit Datumszeiten erhalten.

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

Einfache Version

Sie könnten Ihre Rückkehr in den Rückruf verschieben.

listEvents(function (eventList) {
  array = eventList;

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

Versprechen Version

Mein Knoten ist etwas eingerostet, aber Sie könnten Ihre Methode ändern, um ein Versprechen zurückzugeben.

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

und dann, da Sie bereits async verwenden

id="vor-3"
Beantwortet am 23/05/2020 um 15:33
quelle vom benutzer

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