Η Λάμδα επιστρέφει 200 με άδειο αντικείμενο, χωρίς να υποχωρεί για επιστροφή στη φωτιά

ψήφοι
-1

Χτυπάω το google ημερολόγιο api και έχω μια ρύθμιση λάμδα σε μια asny δοκιμή. Προσπάθησα να προσθέσω αναμονή σε κάθε λειτουργία, προσπάθησα να μεταφέρω την επιστροφή μετά το if (err), αλλά αυτό μου δίνει 500. Αυτό που πρέπει να κάνω είναι να μεταφέρω τα δεδομένα πίνακα από τη λειτουργία api ημερολογίου google στο μήνυμα, ώστε να μπορώ να πάρω στο μπροστινό μου μέρος. Εδώ είναι το λάμδα μέχρι στιγμής. Οποιαδήποτε βοήθεια θα εκτιμηθεί ιδιαίτερα. Ευχαριστώ


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

Αυτή είναι η ανάκτηση που κάνω στο μπροστινό μέρος και επιστρέφει ένα κενό αντικείμενο

const IndexPage = () => {
  fetch(/functions/list-calendar)
    .then(response => response.json())
    .then(response => {
      console.log(response)
    })
Δημοσιεύθηκε 17/05/2020 στις 20:06
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
0

Μου φαίνεται ότι επιστρέφετε την απάντησή σας πριν από την εκτέλεση της επανάκλησης. Εάν δεν είστε εξοικειωμένοι με async και await , θα πρέπει να διαβάσετε αυτήν την τεκμηρίωση . Βασικά πρέπει να περιμένετε να πραγματοποιηθεί η επιστροφή κλήσης προτού επιστρέψετε και μπορείτε είτε να το κάνετε χρησιμοποιώντας λειτουργίες επιστροφής κλήσης, .thens αλυσίδες ή λειτουργίες ασύγχυσης.

Παρατήρησα επίσης στον κωδικό σας ότι καλείτε την επιστροφή κλήσης κάθε φορά που κάνετε μια ώθηση σε πίνακα. Νομίζω ότι είναι απλούστερο να εισάγετε όλα τα αντικείμενά σας array και, στη συνέχεια, επιστρέψτε στον πίνακα.

Αντί να κάνετε μια ώθηση στον χάρτη (που προκαλεί σύγχυση), αυτό επιστρέφει μια νέα σειρά του event.start.dateTime και επειδή εάν (start >= firstDay && end <= lastDay) είναι ψεύτικο, προσθέτει ένα null στον πίνακα, έτσι .filter(x => Boolean(x)); τα φιλτράρετε έτσι ώστε να έχετε μια σειρά από ημερομηνίες.

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

Απλή έκδοση

Θα μπορούσατε να μετακινήσετε την επιστροφή σας στην επιστροφή κλήσης.

listEvents(function (eventList) {
  array = eventList;

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

Έκδοση υπόσχεσης

Ο κόμβος μου είναι λίγο σκουριασμένος, αλλά θα μπορούσατε να αλλάξετε τη μέθοδο για να επιστρέψετε μια υπόσχεση.

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

και τότε, αφού χρησιμοποιείτε ήδη ασύγχρονο,

let array = await listEvents();
Απαντήθηκε 23/05/2020 στις 15:33
πηγή χρήστη

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