คุณทริกเกอร์ฟังก์ชันผ่านคําขอ HTTP ได้โดยใช้
functions.https
ซึ่งช่วยให้คุณเรียกใช้ฟังก์ชันแบบซิงค์ผ่านเมธอด HTTP ที่รองรับต่อไปนี้ได้ GET
, POST
, PUT
, DELETE
และOPTIONS
ตัวอย่างในหน้านี้อิงตามฟังก์ชันตัวอย่างที่ทริกเกอร์เมื่อคุณส่งคำขอ HTTP GET
ไปยังปลายทางของฟังก์ชัน ฟังก์ชันตัวอย่างจะดึงข้อมูลเวลาปัจจุบันของเซิร์ฟเวอร์ จัดรูปแบบเวลาตามที่ระบุไว้ในพารามิเตอร์การค้นหาของ URL และส่งผลลัพธ์ในการตอบกลับ HTTP
ทริกเกอร์ฟังก์ชันด้วยคําขอ HTTP
ใช้ functions.https
เพื่อสร้างฟังก์ชันที่จัดการเหตุการณ์ HTTP ตัวแฮนเดิลเหตุการณ์สําหรับฟังก์ชัน HTTP จะคอยรับเหตุการณ์ onRequest()
ซึ่งรองรับเราเตอร์และแอปที่จัดการโดยเฟรมเวิร์กเว็บ Express
การใช้ออบเจ็กต์คำขอและการตอบกลับแบบด่วน
ออบเจ็กต์ Request ที่ใช้เป็นอาร์กิวเมนต์สําหรับ onRequest()
จะช่วยให้คุณเข้าถึงพร็อพเพอร์ตี้ของคําขอ 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 ที่จะเรียกใช้ตัวรับค่าในตัวอย่าง Express App ด้านบนมีลักษณะดังนี้
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
- โปรแกรมแยกวิเคราะห์เนื้อหาแบบไฟล์ข้อมูล RAW
- โปรแกรมแยกวิเคราะห์เนื้อหาข้อความ
- โปรแกรมแยกวิเคราะห์เนื้อหาแบบ URL-encoded
สมมติว่ามีการเรียกใช้ฟังก์ชันด้วยคําขอต่อไปนี้
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 |
"something" |
req.rawBody |
ไบต์ดิบ (ยังไม่ได้แยกวิเคราะห์) ของคําขอ |
ในตัวอย่างฟังก์ชัน date()
ฟังก์ชันจะทดสอบทั้งพารามิเตอร์ URL และเนื้อหาเพื่อหาค่า format
เพื่อตั้งค่ารูปแบบวันที่/เวลาที่จะใช้
let format = req.query.format; format = req.body.format;
สิ้นสุดฟังก์ชัน HTTP
จบฟังก์ชัน HTTP ด้วย send()
, redirect()
หรือ end()
เสมอ ไม่เช่นนั้น ฟังก์ชันอาจทํางานต่อไปและระบบจะบังคับให้หยุด ดูข้อมูลเพิ่มเติมได้ที่การซิงค์ การทำงานแบบไม่พร้อมกัน และ Promise
หลังจากดึงข้อมูลและจัดรูปแบบเวลาของเซิร์ฟเวอร์โดยใช้โมดูล Node.jsmoment
แล้ว ฟังก์ชัน 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