ฟังก์ชันการโทรผ่านคำขอ HTTP

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

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

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

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

การใช้วัตถุคำขอและการตอบสนองด่วน

ใช้เป็นอาร์กิวเมนต์สำหรับ onRequest() ออบเจ็กต์ Request ให้คุณเข้าถึงคุณสมบัติของคำขอ 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 เท่ากับ 'John'
application/octet-stream 'ข้อความของฉัน' request.body เท่ากับ '6d792074657874' (ไบต์ดิบของคำขอ ดู เอกสารประกอบ Node.js Buffer )
text/plain 'ข้อความของฉัน' request.body เท่ากับ 'ข้อความของฉัน'
application/x-www-form-urlencoded 'ชื่อ=จอห์น' 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 "บาส"
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

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