แสดงเนื้อหาแบบไดนามิกและโฮสต์ Microservice ด้วย Cloud Functions

จับคู่ Cloud Functions กับ Firebase Hosting เพื่อสร้างและแสดงเนื้อหาแบบไดนามิก หรือสร้าง REST API เป็นไมโครเซอร์วิส

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

ดูตัวอย่างกรณีการใช้งานและตัวอย่างของ Cloud Functions ที่ผสานรวมกับ Firebase Hosting ได้ที่ ภาพรวมแบบไม่ใช้เซิร์ฟเวอร์

เชื่อมต่อ Cloud Functions กับ Firebase Hosting

ส่วนนี้จะแสดงตัวอย่างการเชื่อมต่อฟังก์ชันกับ Firebase Hosting แบบทีละขั้นตอน

โปรดทราบว่าคุณสามารถ ปรับการตั้งค่าแคชได้หากต้องการเพื่อปรับปรุงประสิทธิภาพการแสดงเนื้อหาแบบไดนามิก

ขั้นตอนที่ 1: ตั้งค่า Cloud Functions

  1. ตรวจสอบว่าคุณใช้ Firebase CLI เวอร์ชันล่าสุดและ ได้เริ่มต้นใช้งาน Firebase Hosting แล้ว

    ดูวิธีการติดตั้ง CLI และเริ่มต้นใช้งาน Hosting โดยละเอียดได้ที่ คู่มือเริ่มต้นใช้งาน Hosting

  2. ตรวจสอบว่าคุณได้ตั้งค่า Cloud Functions แล้ว โดยทำดังนี้

    • หากคุณตั้งค่า Cloud Functions แล้ว ให้ไปยัง ขั้นตอนที่ 2: สร้างและทดสอบฟังก์ชัน HTTPS

    • หากคุณ ยังไม่ได้ ตั้งค่า Cloud Functions

      1. เริ่มต้นใช้งาน Cloud Functions โดยเรียกใช้คำสั่งต่อไปนี้จาก รูทของไดเรกทอรีโปรเจ็กต์

        firebase init functions
      2. เมื่อได้รับข้อความแจ้ง ให้เลือก JavaScript (ตัวอย่างการดำเนินการทีละขั้นตอนนี้ใช้ JS)

      3. ตรวจสอบว่าคุณมีไดเรกทอรี functions ในไดเรกทอรีโปรเจ็กต์ที่อยู่ในเครื่อง (สร้างขึ้นโดยคำสั่ง Firebase ที่คุณเพิ่งเรียกใช้) ไดเรกทอรี functions นี้เป็นที่เก็บโค้ดสำหรับ Cloud Functions

ขั้นตอนที่ 2: สร้างและทดสอบฟังก์ชัน HTTPS สำหรับเว็บไซต์ Hosting

  1. เปิด /functions/index.js ในตัวแก้ไขที่ต้องการ

  2. แทนที่เนื้อหาของไฟล์ด้วยโค้ดต่อไปนี้

    โค้ดนี้จะสร้างฟังก์ชัน HTTPS (ชื่อ bigben) ที่ตอบกลับคำขอ HTTPS ด้วยเสียง BONG ทุกชั่วโมงของวัน เช่นเดียวกับนาฬิกา

    const functions = require('firebase-functions/v1');
    
    exports.bigben = functions.https.onRequest((req, res) => {
      const hours = (new Date().getHours() % 12) + 1  // London is UTC + 1hr;
      res.status(200).send(`<!doctype html>
        <head>
          <title>Time</title>
        </head>
        <body>
          ${'BONG '.repeat(hours)}
        </body>
      </html>`);
    });
    
  3. ทดสอบฟังก์ชันในเครื่องโดยใช้ Firebase Local Emulator Suite

    1. เรียกใช้คำสั่งต่อไปนี้จากรูทของไดเรกทอรีโปรเจ็กต์ที่อยู่ในเครื่อง

      firebase emulators:start
    2. เข้าถึงฟังก์ชันผ่าน URL ในเครื่องที่ CLI แสดงผล เช่น ตัวอย่าง: http://localhost:5001/PROJECT_ID/us-central1/bigben

ดูข้อมูลเพิ่มเติมเกี่ยวกับคำขอ HTTPS ได้ที่เอกสารประกอบของ Cloud Functions

ขั้นตอนถัดไปจะแนะนำวิธีเข้าถึงฟังก์ชัน HTTPS นี้ จาก Firebase Hosting URL เพื่อให้ฟังก์ชันสร้างเนื้อหาแบบไดนามิกสำหรับ เว็บไซต์ที่โฮสต์ใน Firebase ได้

ขั้นตอนที่ 3: ส่งคำขอ HTTPS ไปยังฟังก์ชัน

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

  1. เปิดไฟล์ firebase.json

  2. เพิ่มการกำหนดค่า rewrite ต่อไปนี้ในส่วน hosting

    "hosting": {
      // ...
    
      // Add the "rewrites" attribute within "hosting"
      "rewrites": [ {
        "source": "/bigben",
        "function": {
          "functionId": "bigben",
          "region": "us-central1"  // optional (see note below)
          "pinTag": true           // optional (see note below)
        }
      } ]
    }
    
  3. ยืนยันว่าการเปลี่ยนเส้นทางทำงานตามที่คาดไว้โดยทดสอบอีกครั้งด้วยโปรแกรมจำลอง Firebase

    1. เรียกใช้คำสั่งต่อไปนี้จากรูทของไดเรกทอรีโปรเจ็กต์ที่อยู่ในเครื่อง

      firebase emulators:start
    2. ไปที่ URL ที่โฮสต์ในเครื่องสำหรับเว็บไซต์ตามที่ CLI แสดงผล (โดยปกติคือ localhost:5000) แต่ให้ต่อท้าย URL ด้วย bigben เช่น http://localhost:5000/bigben

  4. ทำซ้ำฟังก์ชันและฟังก์ชันการทำงานของฟังก์ชันสำหรับเว็บไซต์ ใช้โปรแกรมจำลอง Firebase เพื่อทดสอบการทำซ้ำเหล่านี้

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

  • us-west1
  • us-central1
  • us-east1
  • europe-west1
  • asia-east1

ดูรายละเอียดเพิ่มเติมเกี่ยวกับกฎการเขียนใหม่ได้ที่หน้าการกำหนดค่า Hosting สำหรับ นอกจากนี้ คุณยังดูข้อมูลเกี่ยวกับ ลำดับความสำคัญของการตอบกลับ สำหรับการกำหนดค่า Hosting ต่างๆ ได้ด้วย

โปรดทราบว่าคุณสามารถ ปรับการตั้งค่าแคชได้หากต้องการเพื่อปรับปรุงประสิทธิภาพการแสดงเนื้อหาแบบไดนามิก

ขั้นตอนที่ 4: ทำให้ฟังก์ชันใช้งานได้

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

  1. ทำให้ฟังก์ชัน รวมถึงเนื้อหาและการกำหนดค่า Hosting ใช้งานได้ใน เว็บไซต์โดยเรียกใช้คำสั่งต่อไปนี้จากรูทของไดเรกทอรีโปรเจ็กต์ในเครื่อง

    firebase deploy --only functions,hosting
  2. เข้าถึงเว็บไซต์จริงและฟังก์ชันได้ที่ URL ต่อไปนี้

ใช้เว็บเฟรมเวิร์ก

คุณสามารถใช้เว็บเฟรมเวิร์ก เช่น Express.js ใน Cloud Functions เพื่อ แสดงเนื้อหาแบบไดนามิกของแอปและเขียนเว็บแอปที่ซับซ้อนได้ง่ายขึ้น

ส่วนต่อไปนี้จะแสดงตัวอย่างการดำเนินการทีละขั้นตอนสำหรับการใช้ Express.js กับ Firebase Hosting และ Cloud Functions

  1. ติดตั้ง Express.js ในโปรเจ็กต์ที่อยู่ในเครื่องโดยเรียกใช้คำสั่งต่อไปนี้จากไดเรกทอรี functions

    npm install express --save
  2. เปิดไฟล์ /functions/index.js จากนั้นนำเข้าและเริ่มต้นใช้งาน Express.js

    const functions = require('firebase-functions/v1');
    const express = require('express');
    const app = express();
  3. เพิ่มปลายทาง 2 รายการต่อไปนี้

    1. เพิ่มปลายทางแรกเพื่อแสดงดัชนีของเว็บไซต์ที่ /

      app.get('/', (req, res) => {
        const date = new Date();
        const hours = (date.getHours() % 12) + 1;  // London is UTC + 1hr;
        res.send(`
          <!doctype html>
          <head>
            <title>Time</title>
            <link rel="stylesheet" href="/style.css">
            <script src="/script.js"></script>
          </head>
          <body>
            <p>In London, the clock strikes:
              <span id="bongs">${'BONG '.repeat(hours)}</span></p>
            <button onClick="refresh(this)">Refresh</button>
          </body>
        </html>`);
      });
      
    2. และปลายทางอีกรายการเพื่อแสดงจำนวน BONG เป็น API ในรูปแบบ JSON ภายใต้ /api

      app.get('/api', (req, res) => {
        const date = new Date();
        const hours = (date.getHours() % 12) + 1;  // London is UTC + 1hr;
        res.json({bongs: 'BONG '.repeat(hours)});
      });
      
  4. ส่งออกแอป Express.js เป็นฟังก์ชัน HTTPS

    exports.app = functions.https.onRequest(app);
  5. ในไฟล์ firebase.json ให้ส่งคำขอทั้งหมดไปยังฟังก์ชัน app การเขียนใหม่นี้ช่วยให้ Express.js แสดงเส้นทางย่อยต่างๆ ที่เรา กำหนดค่าไว้ (ในตัวอย่างนี้คือ / และ /api)

    {
     "hosting": {
       // ...
    
       // Add the "rewrites" attribute within "hosting"
       "rewrites": [ {
         "source": "**",
         "function": "app"
       } ]
     }
    }

เพิ่มมิดเดิลแวร์

จากตัวอย่างเดิม ตอนนี้คุณใช้ Express.js แล้ว จึงสามารถเพิ่ม มิดเดิลแวร์ Express.js ในวิธีปกติได้ เช่น คุณสามารถเปิดใช้ CORS คำขอในปลายทางได้

  1. ติดตั้งมิดเดิลแวร์ cors โดยเรียกใช้คำสั่งต่อไปนี้

    npm install --save cors
  2. เปิดไฟล์ /functions/index.js จากนั้นเพิ่ม cors ลงในแอป Express.js ดังนี้

    const cors = require('cors')({origin: true});
    app.use(cors);

ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้ Firebase กับแอป Express และโมดูลมิดเดิลแวร์ได้ที่Cloud Functionsเอกสารประกอบ

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