เรียกใช้ฟังก์ชันผ่านคำขอ HTTP


คุณสามารถทริกเกอร์ฟังก์ชันผ่านคำขอ HTTP ได้โดยใช้ functions.https ซึ่งช่วยให้คุณเรียกใช้ฟังก์ชันแบบซิงโครนัสผ่าน เมธอด HTTP ที่รองรับต่อไปนี้ GET, POST, PUT, DELETE และ OPTIONS

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

ทริกเกอร์ฟังก์ชันที่มีคำขอ HTTP

ใช้ functions.https เพื่อสร้างฟังก์ชันที่จัดการ HTTP กิจกรรม เครื่องจัดการเหตุการณ์สำหรับฟังก์ชัน HTTP จะรอฟังฟังก์ชัน onRequest() เหตุการณ์ ซึ่งรองรับเราเตอร์และแอปที่จัดการโดย เฟรมเวิร์กเว็บ Express

การใช้ออบเจ็กต์คำขอและการตอบกลับ Express

ใช้เป็นอาร์กิวเมนต์สำหรับ onRequest() ออบเจ็กต์ Request จะให้ คุณเข้าถึงพร็อพเพอร์ตี้ของคำขอ HTTP ที่ไคลเอ็นต์ส่ง และ ออบเจ็กต์การตอบสนองช่วยให้คุณ ส่งการตอบสนองกลับไปยังไคลเอ็นต์

exports.date = functions.https.onRequest((req, res) => {
  // ...
});

ใช้แอป Express ที่มีอยู่

การใช้ App เป็นอาร์กิวเมนต์สำหรับ onRequest() คุณสามารถ ส่งแอป Express เต็มรูปแบบไปยังฟังก์ชัน HTTP ย้ายโค้ดต้นแบบได้ ลงในมิดเดิลแวร์ตามที่แสดงดังนี้

const express = require('express');
const cors = require('cors');

const app = express();

// Automatically allow cross-origin requests
app.use(cors({ origin: true }));

// Add middleware to authenticate requests
app.use(myMiddleware);

// build multiple CRUD interfaces:
app.get('/:id', (req, res) => res.send(Widgets.getById(req.params.id)));
app.post('/', (req, res) => res.send(Widgets.create()));
app.put('/:id', (req, res) => res.send(Widgets.update(req.params.id, req.body)));
app.delete('/:id', (req, res) => res.send(Widgets.delete(req.params.id)));
app.get('/', (req, res) => res.send(Widgets.list()));

// Expose Express API as a single Cloud Function:
exports.widgets = functions.https.onRequest(app);

เรียกใช้ฟังก์ชัน HTTP

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

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

ตัวอย่างเช่น URL ที่จะเรียกใช้ date() มีลักษณะดังนี้

https://us-central1-<project-id>.cloudfunctions.net/date

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

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

https://us-central1-<project-id>.cloudfunctions.net/widgets/<id>

หากคุณเรียกใช้ฟังก์ชัน HTTP หลังไฟร์วอลล์หรือตัวกรอง IP คุณสามารถค้นหา ที่อยู่ IP ที่ Google ใช้เพื่อแสดงฟังก์ชัน HTTP

ใช้โมดูลมิดเดิลแวร์ด้วย Cloud Functions

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

// Enable CORS using the `cors` express middleware.
cors(req, res, () => {
  // ...
});

อ่านค่าจากคำขอ

ตารางต่อไปนี้แสดงสถานการณ์ที่พบบ่อยบางส่วน

ประเภทเนื้อหา เนื้อความของคำขอ พฤติกรรม
application/json '{"name":"John"}' request.body.name เท่ากับ "John"
application/octet-stream "ข้อความของฉัน" request.body เท่ากับ '6d792074657874' (ไบต์ดิบของคำขอ โปรดดูเอกสารบัฟเฟอร์ของ Node.js)
text/plain "ข้อความของฉัน" request.body เท่ากับ "ข้อความของฉัน"
application/x-www-form-urlencoded "name=จอห์น" request.body.name เท่ากับ "John"

การแยกวิเคราะห์นี้ดำเนินการโดยโปรแกรมแยกวิเคราะห์เนื้อหาต่อไปนี้

สมมติว่ามีการเรียกฟังก์ชันด้วยคำขอต่อไปนี้

curl -X POST -H "Content-Type:application/json" -H "X-MyHeader: 123" YOUR_HTTP_TRIGGER_ENDPOINT?foo=baz -d '{"text":"something"}'

ข้อมูลที่ส่งจะปรากฏในรูปแบบต่อไปนี้

พร็อพเพอร์ตี้/วิธีการ ค่า
req.method "โพสต์"
req.get('x-myheader') "123"
req.query.foo "Baz"
req.body.text "บางอย่าง"
req.rawBody ไบต์ดิบ (ไม่แยกวิเคราะห์) ของคำขอ

ในตัวอย่างฟังก์ชัน date() ฟังก์ชันนี้จะทดสอบทั้งพารามิเตอร์ของ URL และ เนื้อความสำหรับค่า format เพื่อกำหนดรูปแบบวันที่/เวลาที่จะใช้ ดังนี้

let format = req.query.format;
format = req.body.format;

สิ้นสุดฟังก์ชัน HTTP

สิ้นสุดฟังก์ชัน HTTP ด้วย send(), redirect(), เสมอ หรือ end() มิฉะนั้น ฟังก์ชันอาจทำงานต่อและ ถูกบังคับให้สิ้นสุดการใช้งานโดยระบบ ดูเพิ่มเติม Sync, Async และ Promises

หลังจากเรียกข้อมูลและจัดรูปแบบเวลาของเซิร์ฟเวอร์โดยใช้ Node.js แล้ว โมดูล moment, ฟังก์ชัน date() สรุปโดยการส่งผลลัพธ์ในการตอบสนอง HTTP:

const formattedDate = moment().format(`${format}`);
functions.logger.log('Sending Formatted date:', formattedDate);
res.status(200).send(formattedDate);

การเชื่อมต่อฟังก์ชัน HTTP กับโฮสติ้งของ Firebase

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