A Lambda visszaadja a 200-at üres objektummal, és nem kívánja a visszahívás tüzet

szavazat
-1

Megtalálom a google naptár api-t, és van egy lambda-beállításom egy asny try catch-ben. Megpróbáltam minden funkcióhoz várakozást hozzáadni, megpróbáltam visszatérni az if (hiba) utáni visszatérésbe, de ez 500-at jelent. Azt kell tennem, hogy a tömb adatait a google naptár api funkciójából átadom az üzenetnek, hogy elérhessem az előttem. Itt a lambda eddig. Bármilyen segítséget nagyra értékelnék. Köszönöm


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

Ez az a letöltés, amelyet én elvégzek érte, és egy üres tárgyat ad vissza

const IndexPage = () => {
  fetch(/functions/list-calendar)
    .then(response => response.json())
    .then(response => {
      console.log(response)
    })
A kérdést 17/05/2020 20:06
a forrás felhasználó
Más nyelveken...                            


1 válasz

szavazat
0

Úgy gondolom, hogy a visszahívást még a visszahívás végrehajtása előtt visszaküldi. Ha nem ismeri async és await , olvassa el ezt a dokumentációt . Alapvetően meg kell várnia, hogy a visszahívás megtörténjen, mielőtt visszatérne, és ezt megteheti visszahívási funkciók, .láncok vagy aszinkron függvények használatával.

A kódjában azt is észrevettem, hogy minden alkalommal hívsz visszahívást, amikor tömbbe nyomsz. Úgy gondolom, hogy egyszerűbb az összes elem beillesztése array majd visszahívja a tömböt.

A térkép beillesztése helyett (ami zavaró), ez egy új, az event.start.dateTime tömböt ad vissza, és mert ha (start >= firstDay && end <= lastDay) hamis, hozzáteszi a null a tömbbe, tehát .filter(x => Boolean(x)); kiszűri őket, így csak egy sor datetid kap.

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

Egyszerű verzió

A visszatérést áthelyezheti a visszahívásba.

listEvents(function (eventList) {
  array = eventList;

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

Ígéret verzió

A csomópontom kissé rozsdás, de megváltoztathatja a módszerét az ígéret visszaadására.

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

és miután már használsz async-t,

let array = await listEvents();
Válaszolt 23/05/2020 15:33
a forrás felhasználó

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