Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

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

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

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

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

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

สร้างโปรเจ็กต์ 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 ในการปรับใช้ฟังก์ชั่นไปมีเมฆรันไทม์ฟังก์ชั่น สำหรับการติดตั้งและ Node.js NPM , Node จัดการเวอร์ชัน จะแนะนำ

เมื่อคุณมี 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
  2. ไปที่ไดเรกทอรีโปรเจ็กต์ Firebase
  3. เรียก firebase init firestore สำหรับบทช่วยสอนนี้ คุณสามารถยอมรับค่าเริ่มต้นเมื่อได้รับพร้อมท์สำหรับกฎ Firestore และไฟล์ดัชนี หากคุณไม่ได้ใช้ระบบคลาวด์ FireStore ในโครงการนี้ แต่คุณจะต้องเลือกโหมดการเริ่มต้นและสถานที่สำหรับ FireStore ตามที่อธิบายใน การเริ่มต้นใช้ระบบคลาวด์ FireStore
  4. เรียกใช้ firebase init functions เครื่องมือนี้ให้ตัวเลือกแก่คุณในการติดตั้งการพึ่งพาด้วย npm มันมีความปลอดภัยที่จะลดลงถ้าคุณต้องการที่จะจัดการกับการอ้างอิงในทางอื่น แต่ถ้าคุณทำลดลงคุณจะต้องเรียกใช้ npm install ก่อนที่จะลอกเลียนแบบหรือการปรับใช้ฟังก์ชั่นของคุณ
  5. เครื่องมือนี้ให้คุณสองตัวเลือกสำหรับการสนับสนุนภาษา:

    สำหรับการกวดวิชานี้เลือก 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 ของคุณสำหรับการเขียนและการปรับใช้ฟังก์ชัน คุณสามารถ เลือกรุ่นที่สนับสนุนอื่น ๆ

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

หลังจากที่คุณทำงานตั้งค่าเสร็จแล้ว คุณสามารถเปิดไดเร็กทอรีต้นทางและเริ่มเพิ่มโค้ดตามที่อธิบายไว้ในส่วนต่อไปนี้ สำหรับตัวอย่างนี้โครงการของคุณจะต้องนำเข้าฟังก์ชั่นคลาวด์และโมดูล SDK ผู้ดูแลระบบโดยใช้โหนด 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 เช่นแอปจากการเปลี่ยนแปลงเมฆ FireStore สามารถทำ เมื่อใดก็ตามที่ SDK ผู้ดูแลระบบ สนับสนุนที่มีอยู่มันเป็นสำหรับ FCM รับรองความถูกต้องและเรียลไทม์ Firebase ฐานข้อมูลก็มีวิธีที่มีประสิทธิภาพเพื่อบูรณาการ Firebase ใช้ฟังก์ชั่นคลาวด์

Firebase CLI จะติดตั้ง Firebase และ Firebase SDK สำหรับโมดูลโหนด Cloud Functions โดยอัตโนมัติเมื่อคุณเริ่มต้นโครงการ หากต้องการเพิ่มห้องสมุดของบุคคลที่ 3 ในโครงการของคุณคุณสามารถปรับเปลี่ยน 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 มีซิงโคร (คล้ายกับ ฟังก์ชั่น callable ) ดังนั้นคุณควรส่งการตอบสนองอย่างรวดเร็วที่สุดเท่าที่เป็นไปได้และเลื่อนการทำงานโดยใช้ระบบคลาวด์ 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() รันฟังก์ชั่นเมื่อเมฆ FireStore ถูกเขียนไปยัง ref.set ฟังก์ชั่นกำหนดเอกสารเพื่อฟังบน เพื่อเหตุผลด้านประสิทธิภาพ คุณควรเจาะจงให้มากที่สุด

จัดฟันตัวอย่างเช่น {documentId} -surround "พารามิเตอร์" สัญลักษณ์ที่เปิดเผยข้อมูลการจับคู่ของพวกเขาในการเรียกกลับ

เมฆ FireStore เรียก onWrite() โทรกลับเมื่อใดก็ตามที่ข้อมูลถูกเขียนหรือปรับปรุงในเอกสารที่ได้รับ

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

จำลองการทำงานของฟังก์ชันของคุณ

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

ในการเลียนแบบฟังก์ชันของคุณ:

  1. เรียกใช้ firebase emulators:start และตรวจสอบการส่งออกสำหรับ URL ของ Emulator ห้องสวีทของ 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 จะถูกแทนที่ด้วย ID โครงการของคุณ
    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: เริ่มดำเนินการ "addMessage"

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

    2. ใน FireStore แท็บคุณควรจะเห็นเอกสารที่มีข้อความเดิมของคุณเช่นเดียวกับรุ่น uppercased ข้อความของคุณ (ถ้ามันเป็นมา แต่เดิม "uppercaseme" คุณจะเห็น "UPPERCASEME")

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

เมื่อฟังก์ชันของคุณทำงานตามที่ต้องการในอีมูเลเตอร์ คุณสามารถดำเนินการปรับใช้ ทดสอบ และรันฟังก์ชันเหล่านี้ในสภาพแวดล้อมที่ใช้งานจริงได้ โปรดทราบว่าการปรับใช้ในการแนะนำสภาพแวดล้อมรันไทม์ 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 ควรระบุ ที่ตั้ง เพื่อลดแฝงเครือข่าย

    หากคุณพบข้อผิดพลาดการเข้าถึงเช่น "ไม่สามารถเข้าถึงอนุมัติให้กับโครงการ" ลองตรวจสอบของคุณ aliasing โครงการ

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

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

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

หลังจากการปรับใช้และการดำเนินงานฟังก์ชั่นที่คุณสามารถ ดูบันทึกในคอนโซล Firebase สำหรับฟังก์ชั่นคลาวด์ หากคุณต้องการ ฟังก์ชั่นลบ ในการพัฒนาหรือการผลิตใช้ 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');

// 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 รวมถึงการตั้งค่า Node.js และ CLI