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

คุณสามารถทริกเกอร์ฟังก์ชันผ่านคำขอ 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"

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

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

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

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