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


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

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

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

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

การใช้ออบเจ็กต์คำขอและการตอบกลับของ 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 ที่จะเรียกใช้ 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 เท่ากับ "สมชาย"
application/octet-stream 'ข้อความของฉัน' request.body เท่ากับ "6d792074657874" (ไบต์ดิบของคำขอ โปรดดูเอกสารประกอบเกี่ยวกับบัฟเฟอร์ของ Node.js)
text/plain 'ข้อความของฉัน' request.body เท่ากับ "ข้อความของฉัน"
application/x-www-form-urlencoded 'name=John' request.body.name เท่ากับ "สมชาย"

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

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

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() เสมอ ไม่เช่นนั้น ฟังก์ชันอาจทำงานต่อไปและระบบอาจ บังคับให้หยุดการทำงาน ดูเพิ่มเติม 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 Hosting

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