Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

เริ่มต้น: เขียน ทดสอบ และปรับใช้ฟังก์ชันแรกของคุณ

จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ

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

  • addMessage() ซึ่งเปิดเผย URL ที่ยอมรับค่าข้อความและเขียนไปยัง Cloud Firestore
  • makeUppercase() ซึ่งทริกเกอร์บน Cloud Firestore เขียนและแปลงข้อความเป็นตัวพิมพ์ใหญ่

เราได้เลือกฟังก์ชัน Cloud Firestore และ JavaScript ที่ทริกเกอร์ด้วย HTTP สำหรับตัวอย่างนี้ส่วนหนึ่ง เนื่องจากทริกเกอร์เบื้องหลังเหล่านี้สามารถทดสอบอย่างละเอียดได้ผ่าน Firebase Local Emulator Suite ชุดเครื่องมือนี้ยังสนับสนุน Realtime Database, PubSub, Auth และ HTTP callable triggers ทริกเกอร์พื้นหลังประเภทอื่นๆ เช่น ทริกเกอร์การกำหนดค่าระยะไกล, 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 เวอร์ชันล่าสุด ให้รันคำสั่งเดิมอีกครั้ง

เริ่มต้นโครงการของคุณ

เมื่อคุณเริ่มต้น Firebase SDK สำหรับ Cloud Functions คุณจะสร้างโปรเจ็กต์ว่างที่มีการขึ้นต่อกันและโค้ดตัวอย่างขั้นต่ำบางส่วน และคุณเลือก 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 จะแจ้งให้คุณเลือกฐานรหัสที่มีอยู่หรือเริ่มต้นและตั้งชื่อใหม่ เมื่อคุณเพิ่งเริ่มต้น Codebase เดียวในตำแหน่งเริ่มต้นก็เพียงพอแล้ว ในภายหลัง เมื่อการใช้งานของคุณขยายออกไป คุณอาจต้องการ จัดระเบียบฟังก์ชันใน codebases
  5. CLI ให้คุณสองตัวเลือกสำหรับการสนับสนุนภาษา:

    สำหรับบทช่วยสอนนี้ ให้เลือก JavaScript

  6. CLI ให้ตัวเลือกแก่คุณในการติดตั้งการพึ่งพาด้วย 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 โดยใช้คำสั่ง Node require เพิ่มบรรทัดต่อไปนี้ในไฟล์ index.js ของคุณ:

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

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

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

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

เพิ่ม 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 ถูกส่งผ่านไปยังการเรียกกลับ onRequest()

ฟังก์ชัน HTTP เป็นแบบซิงโครนัส (คล้ายกับ ฟังก์ชัน ที่เรียกได้ ) ดังนั้นคุณควรส่งการตอบกลับโดยเร็วที่สุดและเลื่อนการทำงานโดยใช้ Cloud Firestore addMessage() HTTP ส่งค่าข้อความไปยังปลายทาง 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} — "parameters" แบบเซอร์ราวด์ ซึ่งเป็นสัญลักษณ์แทนที่แสดงข้อมูลที่ตรงกันในการเรียกกลับ

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

ฟังก์ชันที่ขับเคลื่อนด้วยเหตุการณ์ เช่น เหตุการณ์ Cloud Firestore เป็นแบบอะซิงโครนัส ฟังก์ชันเรียกกลับควรส่งคืน 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. ในแท็บ Logs คุณควรเห็นบันทึกใหม่ที่ระบุว่าฟังก์ชัน addMessage() และ makeUppercase() ทำงาน:

      ฟังก์ชัน i: เริ่มดำเนินการ "addMessage"

      ฟังก์ชัน i: เริ่มดำเนินการ "makeUppercase"

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

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

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

เพื่อให้บทช่วยสอนสมบูรณ์ ปรับใช้ฟังก์ชันของคุณแล้วเรียกใช้ 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 Console หากคุณต้องการ ลบฟังก์ชัน ในการพัฒนาหรือใช้งานจริง ให้ใช้ Firebase CLI

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

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

นี่คือ functions/index.js ที่เสร็จสมบูรณ์/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');

// 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 คุณสามารถทำสิ่งต่อไปนี้ได้:

วิดีโอสอน

คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับ Cloud Functions ได้โดยดูวิดีโอแนะนำการใช้งาน ในวิดีโอนี้ คุณจะพบคำแนะนำโดยละเอียดเกี่ยวกับการเริ่มต้นใช้งาน Cloud Functions รวมถึงการตั้งค่า Node.js และ CLI