คุณสามารถทริกเกอร์ฟังก์ชันผ่านคำขอ HTTP ได้โดยใช้ functions.https ซึ่งจะช่วยให้คุณเรียกใช้ฟังก์ชันแบบซิงโครนัสผ่านเมธอด HTTP ที่รองรับต่อไปนี้ได้ GET, POST, PUT, DELETE และ OPTIONS
ตัวอย่างในหน้านี้อิงตาม
ฟังก์ชันตัวอย่าง
ที่จะทริกเกอร์เมื่อคุณส่ง
คำขอ HTTP GET ไปยังปลายทางของฟังก์ชัน ฟังก์ชันตัวอย่างจะดึงเวลาปัจจุบันของเซิร์ฟเวอร์ จัดรูปแบบเวลาตามที่ระบุไว้ในพารามิเตอร์การค้นหาของ URL และส่งผลลัพธ์ในการตอบกลับ HTTP
ทริกเกอร์ฟังก์ชันด้วยคำขอ HTTP
ใช้ functions.https
เพื่อสร้างฟังก์ชันที่จัดการเหตุการณ์ HTTP
ตัวจัดการเหตุการณ์สำหรับฟังก์ชัน HTTP จะคอยรับฟังเหตุการณ์
onRequest() ซึ่งรองรับเราเตอร์และแอปที่จัดการโดยเว็บเฟรมเวิร์ก Express
การใช้ออบเจ็กต์คำขอและการตอบกลับของ Express
ออบเจ็กต์ คำขอ ที่ใช้เป็นอาร์กิวเมนต์สำหรับ onRequest(),
จะให้สิทธิ์เข้าถึงพร็อพเพอร์ตี้ของคำขอ HTTP ที่ไคลเอ็นต์ส่ง และออบเจ็กต์
การตอบกลับ จะช่วยให้คุณ
ส่งการตอบกลับกลับไปยังไคลเอ็นต์ได้
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
หากต้องการแทรกการขึ้นต่อกันของมิดเดิลแวร์สำหรับสิ่งต่างๆ เช่น การรองรับคุกกี้หรือ CORS ให้เรียกใช้สิ่งเหล่านี้ภายในฟังก์ชัน ตัวอย่างเช่น หากต้องการเปิดใช้การรองรับ CORS ให้เพิ่มบล็อกต่อไปนี้
// Enable CORS using the `cors` express middleware. cors(req, res, () => { // ... });
อ่านค่าจากคำขอ
ตารางต่อไปนี้แสดงสถานการณ์ที่พบบ่อยบางสถานการณ์| ประเภทเนื้อหา | เนื้อความของคำขอ | พฤติกรรม |
|---|---|---|
application/json |
'{"name":"John"}' |
request.body.name เท่ากับ 'John' |
application/octet-stream |
'my text' | request.body เท่ากับ '6d792074657874' (ไบต์ดิบของคำขอ โปรดดูเอกสารประกอบเกี่ยวกับบัฟเฟอร์ของ Node.js) |
text/plain |
'my text' | request.body เท่ากับ 'my text' |
application/x-www-form-urlencoded |
'name=John' | request.body.name เท่ากับ 'John' |
การแยกวิเคราะห์นี้ดำเนินการโดยตัวแยกวิเคราะห์เนื้อความต่อไปนี้
- ตัวแยกวิเคราะห์เนื้อความ JSON
- ตัวแยกวิเคราะห์เนื้อความดิบ
- ตัวแยกวิเคราะห์เนื้อความข้อความ
- ตัวแยกวิเคราะห์เนื้อความของแบบฟอร์มที่เข้ารหัส 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 |
"something" |
req.rawBody |
ไบต์ดิบ (ที่ยังไม่ได้แยกวิเคราะห์) ของคำขอ |
ในตัวอย่างฟังก์ชัน date() ฟังก์ชันจะทดสอบทั้งพารามิเตอร์ URL และเนื้อความเพื่อหาค่า format เพื่อตั้งค่ารูปแบบวันที่/เวลาที่จะใช้
let format = req.query.format; format = req.body.format;
สิ้นสุดฟังก์ชัน HTTP
สิ้นสุดฟังก์ชัน HTTP ด้วย send(), redirect(),
หรือ end() เสมอ มิฉะนั้น ฟังก์ชันอาจทำงานต่อไปและระบบจะบังคับให้สิ้นสุด ดูเพิ่มเติมที่
การซิงค์ การไม่พร้อมกัน และสัญญา
หลังจากดึงและจัดรูปแบบเวลาของเซิร์ฟเวอร์โดยใช้โมดูล
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