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


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

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

ทริกเกอร์ฟังก์ชันด้วยคําขอ HTTP

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

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

ออบเจ็กต์คำขอใช้เป็นอาร์กิวเมนต์สำหรับ 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

หากคุณจำเป็นต้องแทรกทรัพยากร 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 'my text' request.body เท่ากับ "ข้อความของฉัน"
application/x-www-form-urlencoded 'name=John' 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() เสมอ ไม่เช่นนั้น ฟังก์ชันอาจทํางานต่อไปและระบบจะบังคับให้หยุดทำงาน ดูข้อมูลเพิ่มเติมได้ที่การซิงค์ การทำงานแบบไม่พร้อมกัน และ Promise

หลังจากเรียกข้อมูลและจัดรูปแบบเวลาของเซิร์ฟเวอร์โดยใช้โมดูล Node.js moment แล้ว ฟังก์ชัน 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