คุณเรียกใช้ฟังก์ชันผ่านคำขอ HTTP ได้โดยใช้ functions.https ซึ่งจะช่วยให้คุณเรียกใช้ฟังก์ชันแบบซิงโครนัสผ่านเมธอด HTTP ที่รองรับต่อไปนี้ได้ GET, POST, PUT, DELETE และ OPTIONS
ตัวอย่างในหน้านี้อิงตามฟังก์ชันตัวอย่างที่จะทริกเกอร์เมื่อคุณส่งคำขอ HTTP GET ไปยังปลายทางของฟังก์ชัน ฟังก์ชันตัวอย่างจะดึงเวลาปัจจุบันของเซิร์ฟเวอร์ จัดรูปแบบเวลาตามที่ระบุในพารามิเตอร์การค้นหา URL และส่งผลลัพธ์ในการตอบกลับ HTTP
ทริกเกอร์ฟังก์ชันด้วยคำขอ HTTP
ใช้ functions.https เพื่อสร้างฟังก์ชันที่จัดการเหตุการณ์ HTTP เครื่องจัดการเหตุการณ์สำหรับฟังก์ชัน HTTP จะคอยฟังเหตุการณ์ onRequest() ซึ่งรองรับเราเตอร์และแอปที่จัดการโดยเฟรมเวิร์กเว็บ Express
การใช้ออบเจ็กต์คำขอและการตอบกลับของ Express
เมื่อใช้เป็นอาร์กิวเมนต์สำหรับ onRequest() ออบเจ็กต์ Request จะให้คุณเข้าถึงพร็อพเพอร์ตี้ของคำขอ HTTP ที่ส่งโดยไคลเอ็นต์ และออบเจ็กต์ Response จะให้คุณส่งการตอบกลับกลับไปยังไคลเอ็นต์ได้
exports.date = functions.https.onRequest((req, res) => { // ... });
การใช้แอป Express ที่มีอยู่
เมื่อใช้ App เป็นอาร์กิวเมนต์สำหรับ onRequest() คุณจะส่งแอป Express แบบเต็มไปยังฟังก์ชัน HTTP ได้ คุณสามารถย้ายโค้ด Boilerplate
ไปยังมิดเดิลแวร์ได้ดังนี้
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 เท่ากับ "สมชาย" |
application/octet-stream |
'my text' | request.body เท่ากับ '6d792074657874' (ไบต์ดิบของคำขอ โปรดดูเอกสารประกอบเกี่ยวกับ Node.js Buffer) |
text/plain |
'my text' | request.body เท่ากับ "ข้อความของฉัน" |
application/x-www-form-urlencoded |
'name=John' | request.body.name เท่ากับ "สมชาย" |
การแยกวิเคราะห์นี้ดำเนินการโดยโปรแกรมแยกวิเคราะห์เนื้อหาต่อไปนี้
- JSON body parser
- โปรแกรมแยกวิเคราะห์เนื้อหาดิบ
- โปรแกรมแยกวิเคราะห์เนื้อหาข้อความ
- โปรแกรมแยกวิเคราะห์เนื้อหาแบบฟอร์มที่เข้ารหัส URL
สมมติว่ามีการเรียกใช้ฟังก์ชันด้วยคำขอต่อไปนี้
curl -X POST -H "Content-Type:application/json" -H "X-MyHeader: 123" YOUR_HTTP_TRIGGER_ENDPOINT?foo=baz -d '{"text":"something"}'
จากนั้นข้อมูลที่ส่งจะปรากฏในส่วนต่อไปนี้
| พร็อพเพอร์ตี้/เมธอด | ค่า |
|---|---|
req.method |
"POST" |
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() เสมอ ไม่เช่นนั้น ฟังก์ชันอาจยังคงทำงานต่อไปและระบบจะบังคับให้สิ้นสุดการทำงาน ดูข้อมูลเพิ่มเติมได้ที่การซิงค์, Async และ Promises
หลังจากดึงข้อมูลและจัดรูปแบบเวลาของเซิร์ฟเวอร์โดยใช้โมดูล moment ของ Node.js แล้ว ฟังก์ชัน date() จะสรุปโดยส่งผลลัพธ์ในการตอบกลับ HTTP ดังนี้
const formattedDate = moment().format(`${format}`); functions.logger.log('Sending Formatted date:', formattedDate); res.status(200).send(formattedDate);
การเชื่อมต่อฟังก์ชัน HTTP กับ Firebase Hosting
คุณสามารถเชื่อมต่อฟังก์ชัน HTTP กับ Firebase Hosting ได้ คำขอในเว็บไซต์ Firebase Hosting สามารถส่งผ่านพร็อกซีไปยังฟังก์ชัน HTTP ที่เฉพาะเจาะจงได้ นอกจากนี้ยังช่วยให้คุณใช้โดเมนที่กำหนดเองกับฟังก์ชัน HTTP ได้ด้วย ดูข้อมูลเพิ่มเติมเกี่ยวกับการเชื่อมต่อ Cloud Functions กับ Firebase Hosting