Dalam dokumentasi Cloud Functions tentang pelaporan kesalahan, tertulis ".. .bahwa beberapa jenis pengecualian yang tidak tertangkap (seperti yang dilemparkan secara tidak sinkron) akan menyebabkan awal yang dingin terjadi pada pemanggilan fungsi di masa mendatang. Ini meningkatkan jumlah waktu yang dibutuhkan fungsi Anda untuk berjalan."

Sedangkan dalam Dokumentasi Firebase tentang penanganan kesalahan, dikatakan bahwa kita harus "mengembalikan kesalahan dari callable dengan melemparkan (atau mengembalikan Janji yang ditolak dengan) turunan dari functions.https.HttpsError ... untuk memastikan klien mendapatkan detail kesalahan yang berguna":

if (!(typeof text === 'string') || text.length === 0) {
  // Throwing an HttpsError so that the client gets the error details.
  throw new functions.https.HttpsError('invalid-argument', 'The function must be called with one arguments "text" containing the message text to add.');
}

Jadi bagi saya ini terdengar seperti HttpsError diperlakukan secara khusus dibandingkan dengan Error yang dilemparkan lainnya.

Pertanyaan saya adalah: Apakah melempar HttpsError dalam Fungsi Cloud yang Dapat Dipanggil seperti yang ditunjukkan di atas menyebabkan fungsi gagal dan karenanya menyebabkan mulai dingin< /strong> untuk pemanggilan selanjutnya?

Jika itu masalahnya, melempar HttpsError tidak akan masuk akal untuk kesalahan "yang diharapkan" seperti argumen yang hilang seperti dalam kasus ini, instance Fungsi dapat dan memang harus digunakan kembali untuk alasan kinerja.

Jadi jika itu masalahnya, akan lebih baik untuk mengembalikan sesuatu seperti:

return {
  error: true,
  error_code: 'invalid_argument',
}

Dan tangani ini di klien alih-alih HttpsError.

Atau apakah solusi yang tepat untuk mengembalikan kesalahan ke klien tanpa menyebabkan fungsi menyebabkan awal yang dingin adalah mengembalikan Janji yang ditolak alih-alih melempar?

if (!(typeof text === 'string') || text.length === 0) {
  // Throwing an HttpsError so that the client gets the error details.
  return Promise.reject(new functions.https.HttpsError('invalid-argument', 'The function must be called with one arguments "text" containing the message text to add.'));
}

Menurut dokumen, sepertinya tidak ada perbedaan antara throw new HttpsError(...) dan return Promise.reject(new HttpsError(...)) tapi mungkin saya salah membacanya.

0
sceee 26 Mei 2021, 14:02

1 menjawab

Jawaban Terbaik

Dengan Firebase Callable Cloud Functions, dengan mengirimkan kembali hasil atau dengan melempar instance functions.https.HttpsError Anda benar-benar menunjukkan ke platform Cloud Function bahwa Anda function telah mencapai kondisi atau status penghentiannya dan platform dapat mematikan instance Cloud Function yang menjalankan fungsi Anda.

Yang penting untuk diperhatikan adalah bahwa kita menggunakan can: platform dapat langsung mematikan instance atau tidak dan membiarkannya selama beberapa waktu, tidak digunakan. Ini di luar kendali Anda.

Hasil: Jika pemanggilan Cloud Function Anda berikutnya terjadi saat instance masih aktif, instance ini akan digunakan kembali dan tidak akan ada cold-start (hal yang sama akan terjadi jika instance lain yang sama Cloud Function tidak aktif dan masih aktif). Jika, sebaliknya, instance dimatikan saat pemanggilan berikutnya terjadi (dan tidak ada instance lain dari Cloud Function yang sama menganggur dan lebih tinggi), platform akan menjalankan instance baru dan akan ada cold start.

Dengan kata lain, platform Cloud Function akan "melihat" jika ada instance Fungsi khusus ini yang dan menganggur. Jika ya, itu akan menggunakannya, jika tidak, itu akan membuat instance baru.

Kesimpulan, dalam kasus Anda, tentang cara mengembalikan kesalahan seperti "argumen yang hilang": Anda dapat mengembalikan objek seperti yang Anda lakukan dalam pertanyaan Anda (atau mengembalikan Janji yang diselesaikan dengan objek ini jika Fungsi mengimplementasikan beberapa operasi asinkron) atau melempar instance functions.https.HttpsError. Tidak akan ada bedanya dalam hal cold start, lihat komentar @samthecodingman di bawah ini.


Perhatikan hal berikut tentang kalimat pertama dari jawaban ini:

"Mengirim kembali hasil" berarti:

  • Mengembalikan Objek JavaScript jika tidak ada operasi asinkron di Cloud Function Anda (lihat contoh di doc untuk hasil operasi penjumlahan), atau;
  • Mengembalikan janji setelah operasi asinkron.

"Melempar instance functions.https.HttpsError" berarti:

  • Melakukan throw new functions.https.HttpsError(...), atau;
  • Mengembalikan Janji yang ditolak dengan instance functions.https.HttpsError.
1
Renaud Tarnec 27 Mei 2021, 09:27