लैम्ब्डा 200 को खाली वस्तु के साथ लौट रही है, आग के लिए कॉलबैक के लिए नहीं

वोट
25

मैं Google कैलेंडर एपीआई को मार रहा हूं, और मेरे पास एक असम्बरी ट्राइ कैच में एक लैम्ब्डा सेटअप है। मैंने हर फ़ंक्शन में प्रतीक्षा जोड़ने की कोशिश की है, अगर (ग़लती) के बाद वापसी को स्थानांतरित करने की कोशिश की है, लेकिन मुझे एक 500 देता है। मुझे क्या करने की आवश्यकता है 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 , आपको यह दस्तावेज पढ़ना चाहिए। मूल रूप से आपको कॉलबैक के लौटने से पहले इंतजार करने की आवश्यकता होती है, और आप कॉलबैक फ़ंक्शंस, .then चेन या async फ़ंक्शंस का उपयोग करके या तो ऐसा कर सकते हैं।

मैंने आपके कोड में यह भी देखा कि आप कॉलबैक कॉल कर रहे हैं हर बार आप सरणी में एक पुश कर रहे हैं। मुझे लगता है कि यह आपके सभी वस्तुओं को धकेलने में सरल है 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([]);
      }
    })
  });
}

और फिर, क्योंकि आप पहले से ही async का उपयोग कर रहे हैं,

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