Lambda 200 boş nesne ile geri dönüyor, ateş için geri arama için wiatiing değil

oy
25

Google takvim API'sına vuruyorum ve bir asny deneyin yakalamak bir lambda kurulum var. Ben her işleve bekliyor eklemeyi denedim, eğer if (err) sonra dönüş hareket çalıştı ama bana 500 verir. Ne yapmam gerekir iletiye google takvim api işlevinden dizi veri iletmektir böylece alabilirsiniz benim ön ucumda. İşte şimdiye kadar lambda. Herhangi bir yardım büyük mutluluk duyacağız. Teşekkürler


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

Bu ön uç için yaptığım getirme ve boş bir nesne döndürüyor

const IndexPage = () => {
  fetch(/functions/list-calendar)
    .then(response => response.json())
    .then(response => {
      console.log(response)
    })
Oluştur 17/05/2020 saat 20:06
kaynak kullanıcı
Diğer dillerde...                            


1 cevaplar

oy
0

Geri arama yapılmadan önce yanıtınızı iade ettiğiniz anlaşılıyor. Eğer aşina değilseniz async ve await , bu belgeleri okumalısınız. Temel olarak, geri dönmeden önce geri aramanın gerçekleşmesini beklemeniz gerekir ve bunu geri arama işlevlerini, .then zincirlerini veya zaman uyumsuz işlevlerini kullanarak yapabilirsiniz.

Ayrıca kodunuzda dizi içine her itme yaptığınızda geri arama yaptığınızı fark ettim. Tüm öğelerinizi içeri aktarmanın daha basit olduğunu düşünüyorum array ve sonra diziyi geri çağırır.

Haritada bir itme yapmak yerine (ki bu kafa karıştırıcıdır), yeni bir event.start.dateTime dizisi döndürür ve (start >= firstDay && end <= lastDay) yanlış, bir null diziye, yani .filter(x => Boolean(x)); filtreler, böylece bir dizi tarih elde edersiniz.

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

Basit Sürüm

Geri dönüşünüzü geri aramaya taşıyabilirsiniz.

listEvents(function (eventList) {
  array = eventList;

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

Promise Sürümü

Düğümüm biraz paslı ama bir söz vermek için yöntemini değiştirebilirsin.

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

ve sonra, zaten eşzamansız kullandığınız için,

let array = await listEvents();
Cevap 23/05/2020 saat 15:33
kaynak kullanıcı

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