เริ่มต้นใช้งาน: เขียน ทดสอบ และทำให้ฟังก์ชันแรกใช้งานได้


หากต้องการเริ่มต้นใช้งาน Cloud Functions ให้ลองทำตามบทแนะนำนี้ ซึ่งจะเริ่มต้นด้วยงานการตั้งค่าที่จำเป็น การสร้าง การทดสอบ และการใช้ฟังก์ชันที่เกี่ยวข้อง 2 รายการต่อไปนี้

  • ฟังก์ชัน "เพิ่มข้อความ" ที่แสดง URL ที่ยอมรับค่าข้อความและเขียนลงใน Cloud Firestore
  • ฟังก์ชัน "make uppercase" ที่ทริกเกอร์เมื่อมีการเขียน Cloud Firestore และเปลี่ยนข้อความเป็นตัวพิมพ์ใหญ่

เราได้เลือกฟังก์ชัน JavaScript Cloud Firestore และฟังก์ชัน JavaScript ที่ทริกเกอร์ HTTP สำหรับตัวอย่างนี้ส่วนหนึ่งเนื่องจากทริกเกอร์พื้นหลังเหล่านี้ได้รับการทดสอบอย่างละเอียดผ่าน Firebase Local Emulator Suite ชุดเครื่องมือนี้ยังรองรับทริกเกอร์ Realtime Database, PubSub, การตรวจสอบสิทธิ์ และทริกเกอร์ที่เรียกใช้ได้ของ HTTP ด้วย ทริกเกอร์พื้นหลังประเภทอื่นๆ เช่น ทริกเกอร์ Remote Config, TestLab และ Analytics สามารถทดสอบแบบอินเทอร์แอกทีฟได้โดยใช้เครื่องมือที่ไม่ได้อธิบายในหน้านี้

ส่วนต่อไปนี้ของบทแนะนํานี้จะอธิบายขั้นตอนการสร้าง ทดสอบ และติดตั้งใช้งานตัวอย่าง หากต้องการเรียกใช้โค้ดและตรวจสอบโค้ด ให้ข้ามไปที่ ตรวจสอบโค้ดตัวอย่างที่สมบูรณ์

สร้างโปรเจ็กต์ Firebase

  1. ในคอนโซล Firebase ให้คลิกเพิ่มโปรเจ็กต์

    • หากต้องการเพิ่มทรัพยากร Firebase ไปยังโปรเจ็กต์ Google Cloud ที่มีอยู่ ให้ป้อนชื่อโปรเจ็กต์หรือเลือกจากเมนูแบบเลื่อนลง

    • หากต้องการสร้างโปรเจ็กต์ใหม่ ให้ป้อนชื่อโปรเจ็กต์ที่ต้องการ นอกจากนี้ คุณยังแก้ไขรหัสโปรเจ็กต์ที่แสดงใต้ชื่อโปรเจ็กต์ได้ด้วย

  2. เมื่อได้รับข้อความแจ้ง ให้อ่านและยอมรับข้อกำหนดของ Firebase

  3. คลิกต่อไป

  4. (ไม่บังคับ) ตั้งค่า Google Analytics ให้กับโปรเจ็กต์ซึ่งจะช่วยให้คุณได้รับประสบการณ์การใช้งานที่ดีที่สุดโดยใช้ผลิตภัณฑ์ Firebase ต่อไปนี้

    เลือกบัญชี Google Analytics ที่มีอยู่หรือสร้างบัญชีใหม่

    หากคุณสร้างบัญชีใหม่ ให้เลือกAnalyticsสถานที่รายงาน แล้วยอมรับการตั้งค่าการแชร์ข้อมูลและข้อกําหนดของ Google Analytics สําหรับโปรเจ็กต์

  5. คลิกสร้างโปรเจ็กต์ (หรือเพิ่ม Firebase หากคุณใช้โปรเจ็กต์ Google Cloud ที่มีอยู่)

Firebase จะจัดสรรทรัพยากรสำหรับโปรเจ็กต์ Firebase โดยอัตโนมัติ เมื่อขั้นตอนเสร็จสมบูรณ์ ระบบจะนำคุณไปที่หน้าภาพรวมของโปรเจ็กต์ Firebase ในคอนโซล Firebase

ตั้งค่า Node.js และ Firebase CLI

คุณจะต้องมีสภาพแวดล้อม Node.js เพื่อเขียนฟังก์ชัน และจะต้องมี Firebase CLI เพื่อทำให้ฟังก์ชันใช้งานได้ในรันไทม์ Cloud Functions สําหรับการติดตั้ง Node.js และ npm เราขอแนะนําให้ใช้ Node Version Manager

เมื่อติดตั้ง Node.js และ npm แล้ว ให้ติดตั้ง Firebase CLI ผ่านวิธีที่คุณต้องการ หากต้องการติดตั้ง CLI ผ่าน npm ให้ใช้คำสั่งต่อไปนี้

npm install -g firebase-tools

การดำเนินการนี้จะติดตั้งคำสั่ง Firebase ที่ใช้ได้ทั่วโลก หากคำสั่งไม่สำเร็จ คุณอาจต้องเปลี่ยนสิทธิ์ npm หากต้องการอัปเดต firebase-tools เป็นเวอร์ชันล่าสุด ให้เรียกใช้คำสั่งเดิมอีกครั้ง

เริ่มต้นโปรเจ็กต์

เมื่อเริ่ม SDK ของ Firebase สำหรับ Cloud Functions จะเป็นการสร้างโปรเจ็กต์ว่างที่มีทรัพยากร Dependency และโค้ดตัวอย่างขั้นต่ำบางส่วน รวมถึงคุณเลือก TypeScript หรือ JavaScript สำหรับการเขียนฟังก์ชัน เพื่อให้เป็นไปตามวัตถุประสงค์ของบทแนะนำนี้ คุณจะต้องเริ่มต้น Cloud Firestore ด้วย

วิธีเริ่มต้นโปรเจ็กต์

  1. เรียกใช้ firebase login เพื่อเข้าสู่ระบบผ่านเบราว์เซอร์และตรวจสอบสิทธิ์ Firebase CLI
  2. ไปที่ไดเรกทอรีโปรเจ็กต์ Firebase
  3. เรียกใช้ firebase init firestore สำหรับบทแนะนำนี้ คุณจะยอมรับค่าเริ่มต้นได้เมื่อระบบแจ้งให้ใช้กฎ Firestore และไฟล์ดัชนี หากยังไม่เคยใช้ Cloud Firestore ในโปรเจ็กต์นี้ คุณจะต้องเลือกโหมดและตำแหน่งเริ่มต้นสำหรับ Firestore ตามที่อธิบายไว้ในส่วนเริ่มต้นใช้งาน Cloud Firestore
  4. เรียกใช้ firebase init functions CLI จะแจ้งให้คุณเลือกฐานโค้ดที่มีอยู่ หรือเริ่มต้นและตั้งชื่อฐานโค้ดใหม่ เมื่อคุณเพิ่งเริ่มต้น โค้ดเบสเดียวในตำแหน่งเริ่มต้นก็เพียงพอแล้ว หลังจากนั้นเมื่อการใช้งานจะขยายออก คุณอาจต้องจัดระเบียบฟังก์ชันในโค้ดเบส
  5. CLI มีตัวเลือกการสนับสนุนภาษา 2 ตัวเลือก ได้แก่

    เลือก JavaScript สำหรับบทแนะนํานี้

  6. CLI มีตัวเลือกให้ติดตั้ง Dependency ด้วย npm แต่คุณสามารถปฏิเสธได้หากต้องการจัดการการอ้างอิงด้วยวิธีอื่น แต่หากต้องการปฏิเสธ คุณจะต้องเรียกใช้ npm install ก่อนที่จะจำลองหรือทำให้ฟังก์ชันใช้งานได้

หลังจากคำสั่งเหล่านี้เสร็จสมบูรณ์แล้ว โครงสร้างโปรเจ็กต์จะมีลักษณะดังนี้

myproject
 +- .firebaserc    # Hidden file that helps you quickly switch between
 |                 # projects with `firebase use`
 |
 +- firebase.json  # Describes properties for your project
 |
 +- functions/     # Directory containing all your functions code
      |
      +- .eslintrc.json  # Optional file containing rules for JavaScript linting.
      |
      +- package.json  # npm package file describing your Cloud Functions code
      |
      +- index.js      # main source file for your Cloud Functions code
      |
      +- node_modules/ # directory where your dependencies (declared in
                       # package.json) are installed

ไฟล์ package.json ที่สร้างขึ้นระหว่างการเริ่มต้นมีคีย์สำคัญคือ "engines": {"node": "16"} ซึ่งจะระบุเวอร์ชัน Node.js ของคุณสำหรับเขียนและทำให้ฟังก์ชันใช้งานได้ คุณสามารถเลือกเวอร์ชันอื่นๆ ที่รองรับได้

นําเข้าโมดูลที่จําเป็นและเริ่มต้นแอป

หลังจากทํางานตั้งค่าเสร็จแล้ว คุณสามารถเปิดไดเรกทอรีต้นทางและเริ่มเพิ่มโค้ดตามที่อธิบายไว้ในส่วนต่อไปนี้ สำหรับตัวอย่างนี้ โปรเจ็กต์ของคุณต้องนำเข้าโมดูล Cloud Functions และ Admin SDK โดยใช้คำสั่ง require ของโหนด เพิ่มบรรทัดต่อไปนี้ลงในไฟล์ index.js

// The Cloud Functions for Firebase SDK to create Cloud Functions and set up triggers.
const functions = require('firebase-functions/v1');

// The Firebase Admin SDK to access Firestore.
const admin = require("firebase-admin");
admin.initializeApp();

บรรทัดเหล่านี้จะโหลดโมดูล firebase-functions และ firebase-admin และเริ่มต้นอินสแตนซ์ของแอป admin ที่จะทำการเปลี่ยนแปลง Cloud Firestore ได้ เมื่อใดก็ตามที่การรองรับ Admin SDK พร้อมให้บริการ เช่น FCM, Authentication และ Firebase Realtime Database ฟีเจอร์ดังกล่าวจะเป็นวิธีที่มีประสิทธิภาพในการผสานรวม Firebase โดยใช้ Cloud Functions

Firebase CLI จะติดตั้ง Firebase และ Firebase SDK สําหรับโมดูล Node ของ Cloud Functions โดยอัตโนมัติเมื่อคุณเริ่มต้นโปรเจ็กต์ หากต้องการเพิ่มไลบรารีของบุคคลที่สามลงในโปรเจ็กต์ คุณจะแก้ไข package.json และเรียกใช้ npm install ได้ ดูข้อมูลเพิ่มเติมได้ที่จัดการ Dependency

เพิ่มฟังก์ชัน addMessage()

สําหรับฟังก์ชัน addMessage() ให้เพิ่มบรรทัดต่อไปนี้ลงใน index.js

// Take the text parameter passed to this HTTP endpoint and insert it into
// Firestore under the path /messages/:documentId/original
exports.addMessage = functions.https.onRequest(async (req, res) => {
  // Grab the text parameter.
  const original = req.query.text;
  // Push the new message into Firestore using the Firebase Admin SDK.
  const writeResult = await admin
    .firestore()
    .collection("messages")
    .add({ original: original });
  // Send back a message that we've successfully written the message
  res.json({ result: `Message with ID: ${writeResult.id} added.` });
});

ฟังก์ชัน addMessage() เป็นปลายทาง HTTP คำขอที่ส่งไปยังปลายทางจะส่งผลให้เกิดออบเจ็กต์คำขอและการตอบกลับแบบ ExpressJS ที่ส่งไปยัง Callback ของ onRequest()

ฟังก์ชัน HTTP เป็นการทำงานแบบซิงค์ (คล้ายกับฟังก์ชันที่เรียกใช้ได้) คุณจึงควรส่งการตอบกลับโดยเร็วที่สุดและเลื่อนการทำงานโดยใช้ Cloud Firestore ฟังก์ชัน HTTP addMessage() จะส่งค่าข้อความไปยังปลายทาง HTTP และแทรกลงในฐานข้อมูลภายใต้เส้นทาง /messages/:documentId/original

เพิ่มฟังก์ชัน makeUppercase()

สำหรับฟังก์ชัน makeUppercase() ให้เพิ่มบรรทัดต่อไปนี้ใน index.js

// Listens for new messages added to /messages/:documentId/original and creates an
// uppercase version of the message to /messages/:documentId/uppercase
exports.makeUppercase = functions.firestore
  .document("/messages/{documentId}")
  .onCreate((snap, context) => {
    // Grab the current value of what was written to Firestore.
    const original = snap.data().original;

    // Access the parameter `{documentId}` with `context.params`
    functions.logger.log("Uppercasing", context.params.documentId, original);

    const uppercase = original.toUpperCase();

    // You must return a Promise when performing asynchronous tasks inside a Functions such as
    // writing to Firestore.
    // Setting an 'uppercase' field in Firestore document returns a Promise.
    return snap.ref.set({ uppercase }, { merge: true });
  });

ฟังก์ชัน makeUppercase() จะทำงานเมื่อมีการเขียนลงใน Cloud Firestore ฟังก์ชัน ref.set จะกำหนดเอกสารที่จะรับฟัง คุณควรระบุข้อมูลให้เฉพาะเจาะจงที่สุดเพื่อเหตุผลด้านประสิทธิภาพ

วงเล็บ เช่น {documentId} จะล้อมรอบ "พารามิเตอร์" ซึ่งเป็นไวลด์การ์ดที่แสดงข้อมูลที่ตรงกันในคอลแบ็ก

Cloud Firestore จะทริกเกอร์การเรียกกลับ onCreate() ทุกครั้งที่มีการเพิ่มข้อความใหม่

ฟังก์ชันที่ทำงานตามเหตุการณ์ เช่น เหตุการณ์ Cloud Firestore จะทำงานแบบไม่พร้อมกัน ฟังก์ชัน Callback ควรแสดงผล null, ออบเจ็กต์ หรือ Promise หากไม่แสดงผลใดๆ ฟังก์ชันจะหมดเวลาซึ่งเป็นการส่งสัญญาณข้อผิดพลาด แล้วลองอีกครั้ง โปรดดูการซิงค์ ไม่พร้อมกัน และสัญญา

จำลองการดำเนินการของฟังก์ชัน

Firebase Local Emulator Suite ช่วยให้คุณสร้างและทดสอบแอปในเครื่องของคุณแทนที่จะทําให้ใช้งานได้ในโปรเจ็กต์ Firebase เราขอแนะนำเป็นอย่างยิ่งให้ใช้การทดสอบในเครื่องระหว่างการพัฒนา ซึ่งส่วนหนึ่งเป็นเพราะลดความเสี่ยงจากข้อผิดพลาดในการเขียนโค้ดซึ่งอาจก่อให้เกิดค่าใช้จ่ายในสภาพแวดล้อมการใช้งานจริง (เช่น การวนซ้ำอย่างไม่สิ้นสุด)

วิธีจําลองฟังก์ชัน

  1. เรียกใช้ firebase emulators:start และตรวจสอบเอาต์พุตสำหรับ URL ของ Emulator Suite UI โดยมีค่าเริ่มต้นเป็น localhost:4000 แต่อาจโฮสต์ในพอร์ตอื่นในเครื่องของคุณ ป้อน URL ดังกล่าวในเบราว์เซอร์เพื่อเปิด Emulator Suite UI

  2. ตรวจสอบเอาต์พุตของfirebase emulators:startคำสั่งสำหรับ URL ของฟังก์ชัน HTTP addMessage() โดยจะมีลักษณะคล้ายกับ http://localhost:5001/MY_PROJECT/us-central1/addMessage ยกเว้นเฉพาะ

    1. MY_PROJECT จะแทนที่ด้วยรหัสโปรเจ็กต์ของคุณ
    2. พอร์ตอาจแตกต่างกันในเครื่องของคุณ
  3. เพิ่มสตริงการค้นหา ?text=uppercaseme ต่อท้าย URL ของฟังก์ชัน ซึ่งควรมีลักษณะดังนี้ http://localhost:5001/MY_PROJECT/us-central1/addMessage?text=uppercaseme หรือจะเปลี่ยนข้อความ "ตัวพิมพ์ใหญ่" ให้เป็นข้อความที่กำหนดเองก็ได้

  4. สร้างข้อความใหม่โดยเปิด URL ในแท็บใหม่ในเบราว์เซอร์

  5. ดูผลของฟังก์ชันในEmulator Suite UI

    1. ในแท็บบันทึก คุณควรเห็นบันทึกใหม่ซึ่งระบุว่าฟังก์ชัน addMessage() และ makeUppercase() ทำงานแล้ว

      i functions: Beginning execution of "addMessage"

      i functions: Beginning execution of "makeUppercase"

    2. ในแท็บ Firestore คุณควรเห็นเอกสารที่มีข้อความต้นฉบับและข้อความเวอร์ชันตัวพิมพ์ใหญ่ (หากข้อความเดิมคือ "uppercaseme" คุณจะเห็น "UPPERCASEME")

ติดตั้งใช้งานฟังก์ชันในสภาพแวดล้อมจริง

เมื่อฟังก์ชันทํางานตามที่คาดไว้ในโปรแกรมจําลองแล้ว คุณสามารถดําเนินการต่อเพื่อทำให้ฟังก์ชันใช้งานได้จริงในสภาพแวดล้อมที่ใช้งานจริง โปรดทราบว่าหากต้องการทำให้ใช้งานได้กับสภาพแวดล้อมรันไทม์ Node.js 14 ที่แนะนำ โปรเจ็กต์ต้องอยู่ในแพ็กเกจราคา Blaze ดูราคา Cloud Functions

หากต้องการจบบทแนะนำ ให้ทำให้ฟังก์ชันใช้งานได้ จากนั้นเรียกใช้ addMessage() เพื่อทริกเกอร์ makeUppercase()

  1. เรียกใช้คําสั่งนี้เพื่อทำให้ฟังก์ชันใช้งานได้

     firebase deploy --only functions
     

    หลังจากเรียกใช้คำสั่งนี้ Firebase CLI จะแสดงผล URL สำหรับปลายทางของฟังก์ชัน HTTP ที่เทอร์มินัล คุณควรเห็นบรรทัดต่อไปนี้

    Function URL (addMessage): https://us-central1-MY_PROJECT.cloudfunctions.net/addMessage
    

    URL ดังกล่าวจะมีรหัสโปรเจ็กต์และภูมิภาคของฟังก์ชัน HTTP แม้คุณจะไม่ต้องกังวลในตอนนี้ แต่ฟังก์ชัน HTTP เวอร์ชันที่ใช้งานจริงบางรายการควรระบุตำแหน่งเพื่อลดเวลาในการตอบสนองของเครือข่าย

    หากคุณพบข้อผิดพลาดในการเข้าถึง เช่น "ให้สิทธิ์เข้าถึงโปรเจ็กต์ไม่ได้" โปรดลองตรวจสอบชื่อแทนโปรเจ็กต์

  2. ใช้เอาต์พุตของ URL addMessage() โดย CLI ให้เพิ่มพารามิเตอร์การค้นหาข้อความ แล้วเปิดในเบราว์เซอร์

    https://us-central1-MY_PROJECT.cloudfunctions.net/addMessage?text=uppercasemetoo
    

    ฟังก์ชันจะดำเนินการและเปลี่ยนเส้นทางเบราว์เซอร์ไปยังFirebaseคอนโซลที่ตำแหน่งฐานข้อมูลซึ่งจัดเก็บสตริงข้อความ เหตุการณ์การเขียนนี้จะทริกเกอร์ makeUppercase() ซึ่งจะเขียนสตริงเวอร์ชันตัวพิมพ์ใหญ่

หลังจากติดตั้งใช้งานและเรียกใช้ฟังก์ชันแล้ว คุณสามารถดูบันทึกในคอนโซล Google Cloud หากต้องการลบฟังก์ชันในเวอร์ชันพัฒนาหรือเวอร์ชันที่ใช้งานจริง ให้ใช้ Firebase CLI

ในเวอร์ชันที่ใช้งานจริง คุณอาจต้องเพิ่มประสิทธิภาพของฟังก์ชันและควบคุมค่าใช้จ่ายด้วยการตั้งค่าจำนวนอินสแตนซ์ต่ำสุดและสูงสุดที่จะเรียกใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกรันไทม์เหล่านี้ได้ที่ควบคุมพฤติกรรมการปรับขนาด

ตรวจสอบโค้ดตัวอย่างที่สมบูรณ์

functions/index.js ที่เสร็จสมบูรณ์ซึ่งมีฟังก์ชัน addMessage() และ makeUppercase() ฟังก์ชันเหล่านี้ช่วยให้คุณส่งพารามิเตอร์ไปยังปลายทาง HTTP ที่เขียนค่าไปยัง Cloud Firestore แล้วเปลี่ยนรูปแบบโดยเปลี่ยนอักขระทั้งหมดในสตริงให้เป็นตัวพิมพ์ใหญ่

// The Cloud Functions for Firebase SDK to create Cloud Functions and set up triggers.
const functions = require('firebase-functions/v1');

// The Firebase Admin SDK to access Firestore.
const admin = require("firebase-admin");
admin.initializeApp();

// Take the text parameter passed to this HTTP endpoint and insert it into
// Firestore under the path /messages/:documentId/original
exports.addMessage = functions.https.onRequest(async (req, res) => {
  // Grab the text parameter.
  const original = req.query.text;
  // Push the new message into Firestore using the Firebase Admin SDK.
  const writeResult = await admin
    .firestore()
    .collection("messages")
    .add({ original: original });
  // Send back a message that we've successfully written the message
  res.json({ result: `Message with ID: ${writeResult.id} added.` });
});

// Listens for new messages added to /messages/:documentId/original and creates an
// uppercase version of the message to /messages/:documentId/uppercase
exports.makeUppercase = functions.firestore
  .document("/messages/{documentId}")
  .onCreate((snap, context) => {
    // Grab the current value of what was written to Firestore.
    const original = snap.data().original;

    // Access the parameter `{documentId}` with `context.params`
    functions.logger.log("Uppercasing", context.params.documentId, original);

    const uppercase = original.toUpperCase();

    // You must return a Promise when performing asynchronous tasks inside a Functions such as
    // writing to Firestore.
    // Setting an 'uppercase' field in Firestore document returns a Promise.
    return snap.ref.set({ uppercase }, { merge: true });
  });

ขั้นตอนถัดไป

ในเอกสารประกอบนี้ คุณจะได้เรียนรู้เพิ่มเติมเกี่ยวกับวิธีจัดการฟังก์ชันสำหรับ Cloud Functions รวมถึงวิธีจัดการเหตุการณ์ทุกประเภทที่ Cloud Functions รองรับ

หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับ Cloud Functions คุณยังทําสิ่งต่อไปนี้ได้ด้วย