IBM Cloud Function tidak menghasilkan output

Saya mengalami beberapa masalah saat menjalankan IBM Cloud Function ini:

    /**
  *
  * main() will be run when you invoke this action
  *
  * @param Cloud Functions actions accept a single parameter, which must be a JSON object.
  *
  * @return The output of this action, which must be a JSON object.
  *
  */

function main(params) {

    const https = require('https');

https.get('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY', (resp) => {
  let data = '';

  // A chunk of data has been recieved.
  resp.on('data', (chunk) => {
    data += chunk;
  });

  // The whole response has been received. Print out the result.
  resp.on('end', () => {
    console.log(JSON.parse(data).explanation);
  });

}).on("error", (err) => {
  console.log("Error: " + err.message);
});

}

Masalah saya adalah pemanggilan pertama fungsi ini (setidaknya 3-4 pertama) tidak menghasilkan keluaran. Panggilan berikutnya berjalan dengan baik dan log ditampilkan dengan benar. Bagaimana cara memperbaiki perilaku tak terduga ini? Tentu saja saya ingin mengambil data saya pada panggilan pertama fungsi ini. Terima kasih.


person Francesco_Lastrino    schedule 19.02.2019    source sumber
comment
Tidak yakin apa yang dilakukan fungsi Anda, tetapi sering kali Anda perlu mengembalikan Janji. Hal ini diperlukan agar Cloud Functions menunggu data asinkron diterima dan kemudian memberikan hasilnya. Berikut ini fungsinya: github.com/ IBM-Cloud/github-traffic-stats/blob/master/slack/   -  person data_henrik    schedule 19.02.2019


Jawaban (2)


Node.js menggunakan model pemrograman asinkron non-pemblokiran. Fungsi main ini kembali sebelum respons HTTP tersedia.

Mengembalikan Janji akan memungkinkan Anda menunggu respons HTTP.

function main(params) {
  return new Promise((resolve, reject) => {
    const https = require('https');

    https.get('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY', (resp) => {
      let data = '';

      // A chunk of data has been recieved.
      resp.on('data', (chunk) => {
        data += chunk;
      });

      // The whole response has been received. Print out the result.
      resp.on('end', () => {
        const explanation = JSON.parse(data).explanation
        console.log(explanation);

        resolve({ explanation })
      });

    }).on("error", (err) => {
      console.log("Error: " + err.message);
      reject({ error: err.message })
    });

  })
}
person James Thomas    schedule 19.02.2019

Dua hal tambahan yang perlu diperiksa:

  1. Pastikan untuk menambahkan .json ke titik akhir Anda
  • Contoh: https://<ibm-domain>/api/v1/web/<username>/default/<function>.json
  1. Pastikan untuk memilih Enable as Web Action di menu sidebar Endpoints.

Selain itu, Anda juga harus dapat mengembalikan fungsi utama async sebagai pengganti objek Promise.

async function main(params) {
  try {
    // some `await` function
  } catch (e) {
    // catch `await` errors
  }
}

module.exports = main;
person Andi    schedule 04.07.2020