ในการเริ่มต้นใช้งาน 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
ใน คอนโซล Firebase คลิก เพิ่มโครงการ
หากต้องการเพิ่มทรัพยากร Firebase ให้กับโปรเจ็กต์ Google Cloud ที่มีอยู่ ให้ป้อนชื่อโปรเจ็กต์หรือเลือกจากเมนูแบบเลื่อนลง
หากต้องการสร้างโครงการใหม่ ให้ป้อนชื่อโครงการที่ต้องการ คุณยังเลือกแก้ไขรหัสโปรเจ็กต์ที่แสดงด้านล่างชื่อโปรเจ็กต์ได้อีกด้วย
หากได้รับแจ้ง ให้อ่านและยอมรับ ข้อกำหนดของ Firebase
คลิก ดำเนินการ ต่อ
(ไม่บังคับ) ตั้งค่า Google Analytics สำหรับโปรเจ็กต์ของคุณ ซึ่งทำให้คุณได้รับประสบการณ์ที่ดีที่สุดโดยใช้ผลิตภัณฑ์ Firebase ต่อไปนี้
เลือก บัญชี Google Analytics ที่มีอยู่หรือสร้างบัญชีใหม่
หากคุณสร้างบัญชีใหม่ ให้เลือก ตำแหน่งการรายงาน Analytics จากนั้นยอมรับการตั้งค่าการเปิดเผยข้อมูลและข้อกำหนดของ Google Analytics สำหรับโครงการของคุณ
คลิก สร้างโปรเจ็ กต์ (หรือ เพิ่ม 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 ด้วย
ในการเริ่มต้นโครงการของคุณ:
- เรียกใช้การ
firebase login
เพื่อเข้าสู่ระบบผ่านเบราว์เซอร์และรับรองความถูกต้องของเครื่องมือ firebase - ไปที่ไดเรกทอรีโปรเจ็กต์ Firebase
- เรียกใช้
firebase init firestore
สำหรับบทช่วยสอนนี้ คุณสามารถยอมรับค่าเริ่มต้นเมื่อได้รับพร้อมท์สำหรับกฎ Firestore และไฟล์ดัชนี หากคุณยังไม่ได้ใช้ Cloud Firestore ในโปรเจ็กต์นี้ คุณจะต้องเลือกโหมดเริ่มต้นและตำแหน่งสำหรับ Firestore ตามที่อธิบายไว้ใน เริ่มต้นใช้งาน Cloud Firestore - เรียกใช้
firebase init functions
เครื่องมือนี้ให้ตัวเลือกแก่คุณในการติดตั้งการพึ่งพาด้วย npm การปฏิเสธนั้นปลอดภัยหากคุณต้องการจัดการการขึ้นต่อกันด้วยวิธีอื่น แต่หากคุณปฏิเสธ คุณจะต้องรันการnpm install
ก่อนที่จะจำลองหรือปรับใช้ฟังก์ชันของคุณ เครื่องมือนี้ให้คุณสองตัวเลือกสำหรับการสนับสนุนภาษา:
- JavaScript
- พิมพ์สคริปต์ ดู เขียนฟังก์ชันด้วย TypeScript สำหรับข้อมูลเพิ่มเติม
สำหรับบทช่วยสอนนี้ ให้เลือก JavaScript
หลังจากที่คำสั่งเหล่านี้เสร็จสมบูรณ์ โครงสร้างโครงการของคุณจะมีลักษณะดังนี้:
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": "10"}
สิ่งนี้ระบุเวอร์ชัน 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 ทริกเกอร์การเรียกกลับ onWrite()
ทุกครั้งที่มีการเขียนหรืออัปเดตข้อมูลในเอกสารที่กำหนด
ฟังก์ชันที่ขับเคลื่อนด้วยเหตุการณ์ เช่น เหตุการณ์ Cloud Firestore เป็นแบบอะซิงโครนัส ฟังก์ชันเรียกกลับควรคืน null
วัตถุ หรือ Promise หากคุณไม่ส่งคืนสิ่งใด ฟังก์ชันจะหมดเวลา ส่งสัญญาณข้อผิดพลาด และลองใหม่ ดู การซิงค์ การไม่ซิงค์ และสัญญา
จำลองการทำงานของฟังก์ชันของคุณ
Firebase Local Emulator Suite ช่วยให้คุณสร้างและทดสอบแอปบนเครื่องในพื้นที่ของคุณ แทนที่จะปรับใช้กับโปรเจ็กต์ Firebase ขอแนะนำให้ทำการทดสอบในพื้นที่ระหว่างการพัฒนา ส่วนหนึ่งเป็นเพราะช่วยลดความเสี่ยงจากข้อผิดพลาดในการเข้ารหัสที่อาจก่อให้เกิดต้นทุนในสภาพแวดล้อมการผลิต (เช่น การวนซ้ำแบบไม่สิ้นสุด)
ในการเลียนแบบฟังก์ชันของคุณ:
เรียกใช้
firebase emulators:start
และตรวจสอบผลลัพธ์สำหรับ URL ของ Emulator Suite UI มีค่าเริ่มต้นเป็น localhost:4000 แต่อาจโฮสต์บนพอร์ตอื่นในเครื่องของคุณ ป้อน URL นั้นในเบราว์เซอร์ของคุณเพื่อเปิด Emulator Suite UIตรวจสอบเอาต์พุตของคำสั่ง
firebase emulators:start
สำหรับ URL ของฟังก์ชัน HTTPaddMessage()
มันจะมีลักษณะคล้ายกับhttp://localhost:5001/MY_PROJECT/us-central1/addMessage
ยกเว้นว่า:-
MY_PROJECT
จะถูกแทนที่ด้วยรหัสโครงการของคุณ - พอร์ตอาจแตกต่างกันในเครื่องของคุณ
-
เพิ่มสตริงการสืบค้น
?text=uppercaseme
ต่อท้าย URL ของฟังก์ชัน ควรมีลักษณะดังนี้:http://localhost:5001/MY_PROJECT/us-central1/addMessage?text=uppercaseme
คุณสามารถเปลี่ยนข้อความ "ตัวพิมพ์ใหญ่" เป็นข้อความที่กำหนดเองได้สร้างข้อความใหม่โดยเปิด URL ในแท็บใหม่ในเบราว์เซอร์ของคุณ
ดูเอฟเฟกต์ของฟังก์ชันใน Emulator Suite UI:
ในแท็บ Logs คุณควรเห็นบันทึกใหม่ที่ระบุว่าฟังก์ชัน
addMessage()
และmakeUppercase()
ทำงาน:ฟังก์ชัน i: เริ่มดำเนินการ "addMessage"
ฟังก์ชัน i: เริ่มดำเนินการ "makeUppercase"
ในแท็บ Firestore คุณควรเห็นเอกสารที่มีข้อความต้นฉบับและข้อความเวอร์ชันตัวพิมพ์ใหญ่ (หากเดิมเป็น "ตัวพิมพ์ใหญ่" คุณจะเห็น "ตัวพิมพ์ใหญ่")
ปรับใช้ฟังก์ชันกับสภาพแวดล้อมการผลิต
เมื่อฟังก์ชันของคุณทำงานตามที่ต้องการในอีมูเลเตอร์แล้ว คุณสามารถดำเนินการปรับใช้ ทดสอบ และรันฟังก์ชันเหล่านี้ในสภาพแวดล้อมที่ใช้งานจริงได้ โปรดทราบว่าในการปรับใช้กับสภาพแวดล้อมรันไทม์ Node.js 14 ที่แนะนำ โปรเจ็กต์ของคุณต้องอยู่ใน แผนราคา Blaze ดู ราคาฟังก์ชั่นระบบคลาวด์
เพื่อให้บทช่วยสอนสมบูรณ์ ปรับใช้ฟังก์ชันของคุณแล้วเรียกใช้ addMessage()
เพื่อทริกเกอร์ makeUppercase()
เรียกใช้คำสั่งนี้เพื่อปรับใช้ฟังก์ชันของคุณ:
firebase deploy --only functions
หลังจากที่คุณรันคำสั่งนี้ Firebase CLI จะส่งออก URL สำหรับจุดปลายของฟังก์ชัน HTTP ในเทอร์มินัลของคุณ คุณควรเห็นบรรทัดดังต่อไปนี้:
Function URL (addMessage): https://us-central1-MY_PROJECT.cloudfunctions.net/addMessage
URL ประกอบด้วยรหัสโปรเจ็กต์ของคุณรวมถึงภูมิภาคสำหรับฟังก์ชัน HTTP แม้ว่าคุณไม่จำเป็นต้องกังวลเกี่ยวกับตอนนี้ แต่ฟังก์ชัน HTTP ที่ใช้งานจริงบางอย่างควรระบุ ตำแหน่ง เพื่อลดเวลาแฝงของเครือข่าย
หากคุณพบข้อผิดพลาดในการเข้าถึง เช่น "ไม่สามารถให้สิทธิ์การเข้าถึงโปรเจ็กต์" ให้ลองตรวจสอบชื่อแทน โปรเจ็ กต์ของคุณ
การใช้เอาต์พุต URL ของ
addMessage()
โดย CLI เพิ่มพารามิเตอร์การสืบค้นข้อความ และเปิดในเบราว์เซอร์:https://us-central1-MY_PROJECT.cloudfunctions.net/addMessage?text=uppercasemetoo
ฟังก์ชันนี้ดำเนินการและเปลี่ยนเส้นทางเบราว์เซอร์ไปยังคอนโซล Firebase ที่ตำแหน่งฐานข้อมูลที่เก็บสตริงข้อความไว้ เหตุการณ์การเขียนนี้ทริกเกอร์
makeUppercase()
ซึ่งเขียนสตริงเวอร์ชันตัวพิมพ์ใหญ่
หลังจากปรับใช้และเรียกใช้ฟังก์ชัน คุณสามารถดูบันทึกใน Google Cloud Console หากคุณต้องการ ลบฟังก์ชัน ในการพัฒนาหรือใช้งานจริง ให้ใช้ Firebase CLI
ในการผลิต คุณอาจต้องการเพิ่มประสิทธิภาพการทำงานของฟังก์ชันและควบคุมต้นทุนโดยการตั้งค่าจำนวนอินสแตนซ์ขั้นต่ำและสูงสุดที่จะเรียกใช้ ดู พฤติกรรมการควบคุมมาตราส่วน สำหรับข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกรันไทม์เหล่านี้
ตรวจสอบโค้ดตัวอย่างที่สมบูรณ์
นี่คือฟังก์ชัน/index.js ที่เสร็จสมบูรณ์ซึ่งมีฟังก์ชัน 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'); // 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
- ลองใช้ Codelab ของ Cloud Function
- ตรวจสอบและเรียกใช้ ตัวอย่างโค้ดบน GitHub
- ตรวจสอบการ อ้างอิง API
วิดีโอสอน
คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับ Cloud Functions ได้โดยดูวิดีโอแนะนำการใช้งาน ในวิดีโอนี้ คุณจะพบคำแนะนำโดยละเอียดเกี่ยวกับการเริ่มต้นใช้งาน Cloud Functions รวมถึงการตั้งค่า Node.js และ CLI