Bắt đầu: viết, kiểm thử và triển khai các hàm đầu tiên


Để bắt đầu sử dụng Cloud Functions, hãy thử làm theo hướng dẫn này: bắt đầu bằng các nhiệm vụ thiết lập bắt buộc và hoạt động thông qua việc tạo, kiểm tra, và triển khai hai chức năng có liên quan:

  • Thông báo "thêm thông báo" hàm hiển thị một URL chấp nhận giá trị văn bản và ghi giá trị đó thành Cloud Firestore.
  • "Tạo chữ viết hoa" hàm kích hoạt khi ghi và biến đổi Cloud Firestore thành chữ hoa.

Chúng tôi đã chọn Cloud Firestore và các hàm JavaScript được kích hoạt HTTP cho việc này lấy mẫu một phần vì các trình kích hoạt ở chế độ nền này có thể được thử nghiệm kỹ lưỡng thông qua Firebase Local Emulator Suite. Bộ công cụ này cũng hỗ trợ các trình kích hoạt có thể gọi Realtime Database, PubSub, Auth và HTTP. Bạn có thể kiểm thử tương tác các loại điều kiện kích hoạt trong nền khác như Remote Config, TestLab và điều kiện kích hoạt Analytics bằng cách sử dụng các bộ công cụ không được mô tả trong trang này.

Các phần sau đây của hướng dẫn này trình bày chi tiết các bước cần thiết để tạo ứng dụng, thử nghiệm và triển khai mẫu. Nếu bạn chỉ muốn chạy và kiểm tra mã, hãy chuyển đến phần Xem lại mã mẫu hoàn chỉnh.

Tạo dự án Firebase

  1. Trong bảng điều khiển Firebase, hãy nhấp vào Thêm dự án.

    • Để thêm tài nguyên Firebase vào một dự án Google Cloud hiện có, hãy nhập tên dự án hoặc chọn tên dự án từ trình đơn thả xuống.

    • Để tạo dự án mới, hãy nhập tên dự án mong muốn. Bạn cũng có thể tuỳ ý chỉnh sửa mã dự án xuất hiện bên dưới tên dự án.

  2. Nếu được nhắc, hãy xem xét và chấp nhận các điều khoản của Firebase.

  3. Nhấp vào Tiếp tục.

  4. (Không bắt buộc) Thiết lập Google Analytics cho dự án để có thể để có trải nghiệm tối ưu khi sử dụng bất kỳ sản phẩm Firebase nào sau đây:

    Chọn một Tài khoản Google Analytics hoặc tạo tài khoản mới.

    Nếu bạn tạo tài khoản mới, hãy chọn Analytics vị trí báo cáo, sau đó chấp nhận chế độ cài đặt cách chia sẻ dữ liệu và điều khoản Google Analytics cho dự án.

  5. Nhấp vào Tạo dự án (hoặc Thêm Firebase nếu bạn đang sử dụng dự án Google Cloud hiện có).

Firebase sẽ tự động phân bổ tài nguyên cho dự án Firebase của bạn. Thời gian quá trình hoàn tất, bạn sẽ được đưa đến trang tổng quan cho Firebase dự án trong bảng điều khiển Firebase.

Thiết lập Node.js và Giao diện dòng lệnh (CLI) của Firebase

Bạn sẽ cần môi trường Node.js để viết hàm và bạn sẽ cần CLI Firebase để triển khai hàm vào môi trường thời gian chạy Cloud Functions. Để cài đặt Node.js và npm, bạn nên sử dụng Trình quản lý phiên bản nút.

Sau khi cài đặt Node.js và npm, hãy cài đặt CLI Firebase thông qua phương thức bạn muốn. Để cài đặt CLI qua npm, hãy sử dụng:

npm install -g firebase-tools

Thao tác này sẽ cài đặt lệnh firebase có sẵn trên toàn cầu. Nếu lệnh đó không thành công, bạn có thể cần thay đổi quyền npm. Để cập nhật lên phiên bản firebase-tools mới nhất, hãy chạy lại cùng một lệnh.

Khởi chạy dự án

Khi khởi chạy SDK Firebase cho Cloud Functions, bạn sẽ tạo một dự án trống chứa các phần phụ thuộc và một số mã mẫu tối thiểu, đồng thời chọn TypeScript hoặc JavaScript để soạn các hàm. Đối với mục đích của hướng dẫn này, bạn cũng cần khởi chạy Cloud Firestore.

Cách khởi chạy dự án:

  1. Chạy firebase login để đăng nhập qua trình duyệt và xác thực Firebase CLI.
  2. Chuyển đến thư mục dự án Firebase.
  3. Chạy firebase init firestore. Đối với hướng dẫn này, bạn có thể chấp nhận khi được nhắc về các quy tắc và tệp chỉ mục trên Firestore. Nếu chưa sử dụng Cloud Firestore trong dự án này, bạn cũng cần chọn chế độ khởi động và vị trí cho Firestore như mô tả trong phần Bắt đầu sử dụng Cloud Firestore.
  4. Chạy firebase init functions. CLI nhắc bạn chọn một cơ sở mã hoặc khởi chạy và đặt tên cho một cơ sở mã mới. Khi bạn vừa mới bắt đầu, một cơ sở mã duy nhất ở vị trí mặc định là đủ; sau này, khi việc triển khai của bạn mở rộng, bạn có thể sắp xếp các hàm trong cơ sở mã.
  5. CLI cung cấp cho bạn hai lựa chọn hỗ trợ ngôn ngữ:

    Đối với hướng dẫn này, hãy chọn JavaScript.

  6. CLI cung cấp cho bạn tuỳ chọn cài đặt các phần phụ thuộc có npm. An toàn từ chối nếu bạn muốn quản lý các phần phụ thuộc theo cách khác, Tuy nhiên, nếu từ chối, bạn cần chạy npm install trước khi mô phỏng hoặc triển khai các chức năng.

Sau khi các lệnh này hoàn tất, cấu trúc dự án của bạn sẽ có dạng như sau:

myproject
 +- .firebaserc    # Hidden file that helps you quickly switch between
 |                 # projects with `firebase use`
 |
 +- firebase.json  # Describes properties for your project
 |
 +- functions/     # Directory containing all your functions code
      |
      +- .eslintrc.json  # Optional file containing rules for JavaScript linting.
      |
      +- package.json  # npm package file describing your Cloud Functions code
      |
      +- index.js      # main source file for your Cloud Functions code
      |
      +- node_modules/ # directory where your dependencies (declared in
                       # package.json) are installed

Tệp package.json được tạo trong quá trình khởi chạy chứa một khoá quan trọng: "engines": {"node": "16"}. Thao tác này chỉ định phiên bản Node.js cho viết và triển khai các hàm. Bạn có thể chọn các phiên bản được hỗ trợ khác.

Nhập các mô-đun bắt buộc và khởi chạy ứng dụng

Sau khi hoàn tất các tác vụ thiết lập, bạn có thể mở thư mục nguồn và bắt đầu thêm mã như mô tả trong các phần sau. Đối với mẫu này, dự án của bạn phải nhập Cloud Functions và các mô-đun SDK quản trị sử dụng Nút require tuyên bố. Thêm các dòng như sau vào tệp index.js:

// The Cloud Functions for Firebase SDK to create Cloud Functions and set up triggers.
const functions = require('firebase-functions/v1');

// The Firebase Admin SDK to access Firestore.
const admin = require("firebase-admin");
admin.initializeApp();

Các dòng này tải các mô-đun firebase-functionsfirebase-admin, đồng thời khởi chạy một thực thể ứng dụng admin để có thể thực hiện các thay đổi đối với Cloud Firestore. Bất cứ khi nào có hỗ trợ SDK dành cho quản trị viên (như đối với FCM, AuthenticationFirebase Realtime Database), SDK này sẽ cung cấp một cách hiệu quả để tích hợp Firebase bằng Cloud Functions.

Firebase CLI sẽ tự động cài đặt Firebase và SDK Firebase cho các mô-đun Nút Cloud Functions khi bạn khởi chạy dự án của bạn. Để thêm thư viện bên thứ ba vào dự án, bạn có thể sửa đổi package.json và chạy npm install. Để biết thêm thông tin, hãy xem phần Xử lý phần phụ thuộc.

Thêm hàm addMessage()

Đối với hàm addMessage(), hãy thêm các dòng sau vào index.js:

// Take the text parameter passed to this HTTP endpoint and insert it into
// Firestore under the path /messages/:documentId/original
exports.addMessage = functions.https.onRequest(async (req, res) => {
  // Grab the text parameter.
  const original = req.query.text;
  // Push the new message into Firestore using the Firebase Admin SDK.
  const writeResult = await admin
    .firestore()
    .collection("messages")
    .add({ original: original });
  // Send back a message that we've successfully written the message
  res.json({ result: `Message with ID: ${writeResult.id} added.` });
});

Hàm addMessage() là một điểm cuối HTTP. Mọi yêu cầu đến điểm cuối đều dẫn đến các đối tượng Yêu cầuPhản hồi kiểu ExpressJS được truyền đến lệnh gọi lại onRequest().

Các hàm HTTP có tính đồng bộ (tương tự như hàm có thể gọi), nên bạn nên gửi phản hồi nhanh nhất có thể và trì hoãn công việc bằng cách sử dụng Cloud Firestore. Hàm HTTP addMessage() truyền một giá trị văn bản đến điểm cuối HTTP và chèn giá trị đó vào cơ sở dữ liệu theo đường dẫn /messages/:documentId/original.

Thêm hàm makeUppercase()

Đối với hàm makeUppercase(), hãy thêm các dòng sau vào index.js:

// Listens for new messages added to /messages/:documentId/original and creates an
// uppercase version of the message to /messages/:documentId/uppercase
exports.makeUppercase = functions.firestore
  .document("/messages/{documentId}")
  .onCreate((snap, context) => {
    // Grab the current value of what was written to Firestore.
    const original = snap.data().original;

    // Access the parameter `{documentId}` with `context.params`
    functions.logger.log("Uppercasing", context.params.documentId, original);

    const uppercase = original.toUpperCase();

    // You must return a Promise when performing asynchronous tasks inside a Functions such as
    // writing to Firestore.
    // Setting an 'uppercase' field in Firestore document returns a Promise.
    return snap.ref.set({ uppercase }, { merge: true });
  });

Hàm makeUppercase() thực thi khi Cloud Firestore được ghi vào. Chiến lược phát hành đĩa đơn Hàm ref.set xác định tài liệu cần nghe. Vì lý do hiệu suất, bạn nên mô tả càng cụ thể càng tốt.

Dấu ngoặc nhọn (ví dụ: {documentId}) bao quanh "tham số", ký tự đại diện hiển thị dữ liệu trùng khớp trong lệnh gọi lại.

Cloud Firestore kích hoạt onCreate() bất cứ khi nào có tin nhắn mới được thêm.

Các hàm do sự kiện điều khiển như sự kiện Cloud Firestore là không đồng bộ. Hàm callback sẽ trả về null, một Đối tượng, hoặc Promise (Lời hứa). Nếu bạn không trả về giá trị nào, hàm sẽ hết thời gian chờ, báo hiệu lỗi và thử lại. Xem phần Đồng bộ, không đồng bộ và Lời hứa.

Mô phỏng quá trình thực thi các hàm

Chiến lược phát hành đĩa đơn Firebase Local Emulator Suite cho phép bạn tạo và kiểm thử ứng dụng trên máy cục bộ thay vì triển khai cho một dự án Firebase. Bạn nên kiểm thử cục bộ trong quá trình phát triển, một phần là vì việc này làm giảm nguy cơ xảy ra lỗi lập trình có thể gây ra chi phí trong môi trường sản xuất (ví dụ: vòng lặp vô hạn).

Cách mô phỏng các hàm của bạn:

  1. Chạy firebase emulators:start và kiểm tra kết quả cho URL của Emulator Suite UI. Cổng mặc định là localhost:4000, nhưng có thể được lưu trữ trên một cổng khác trên máy của bạn. Nhập URL đó vào trình duyệt của bạn để mở Emulator Suite UI.

  2. Kiểm tra kết quả của lệnh firebase emulators:start cho URL của hàm HTTP addMessage(). Phương thức này sẽ có dạng tương tự như http://localhost:5001/MY_PROJECT/us-central1/addMessage, ngoại trừ:

    1. MY_PROJECT sẽ được thay thế bằng mã dự án của bạn.
    2. Cổng trên máy cục bộ có thể khác.
  3. Thêm chuỗi truy vấn ?text=uppercaseme vào cuối URL của hàm. Mã này sẽ có dạng như sau: http://localhost:5001/MY_PROJECT/us-central1/addMessage?text=uppercaseme. Nếu muốn, bạn có thể thay đổi thông báo "viết hoa" sang một thành phần tuỳ chỉnh .

  4. Tạo thư mới bằng cách mở URL trong một thẻ mới trong trình duyệt.

  5. Xem hiệu ứng của các hàm trong Emulator Suite UI:

    1. Trong thẻ Logs (Nhật ký), bạn sẽ thấy nhật ký mới cho biết các hàm addMessage()makeUppercase() đã chạy:

      i functions: Beginning execution of "addMessage"

      i functions: Beginning execution of "makeUppercase"

    2. Trong thẻ Firestore, bạn sẽ thấy một tài liệu chứa nội dung gốc cũng như phiên bản viết hoa của thông báo (nếu có ban đầu là "chữ hoa", bạn sẽ thấy chữ "viết hoa".

Triển khai các chức năng trong môi trường sản xuất

Khi các hàm của bạn hoạt động như mong muốn trong trình mô phỏng, bạn có thể tiếp tục triển khai, thử nghiệm và chạy chúng trong môi trường sản xuất. Lưu ý để triển khai cho môi trường thời gian chạy Node.js 14 được đề xuất, dự án của bạn phải có trong Gói giá linh hoạt. Xem giá của Cloud Functions.

Để hoàn tất hướng dẫn, hãy triển khai các hàm rồi thực thi addMessage() để kích hoạt makeUppercase().

  1. Chạy lệnh này để triển khai các hàm của bạn:

     firebase deploy --only functions
     

    Sau khi bạn chạy lệnh này, CLI Firebase sẽ xuất URL cho mọi điểm cuối của hàm HTTP. Trong dòng lệnh, bạn sẽ thấy một dòng như sau:

    Function URL (addMessage): https://us-central1-MY_PROJECT.cloudfunctions.net/addMessage
    

    URL này chứa mã dự án cũng như khu vực dành cho giao thức HTTP . Mặc dù hiện tại bạn không cần phải lo lắng về vấn đề này, nhưng một số hàm HTTP chính thức nên chỉ định một vị trí để giảm thiểu độ trễ mạng.

    Nếu bạn gặp lỗi truy cập như "Không thể uỷ quyền truy cập vào dự án", hãy thử kiểm tra tên đại diện của dự án.

  2. Sử dụng URL addMessage() do CLI xuất ra, thêm tham số truy vấn văn bản, và mở tệp đó trong trình duyệt:

    https://us-central1-MY_PROJECT.cloudfunctions.net/addMessage?text=uppercasemetoo
    

    Hàm này thực thi và chuyển hướng trình duyệt đến Bảng điều khiển của Firebase tại vị trí cơ sở dữ liệu nơi chuỗi văn bản được lưu trữ. Chiến dịch này ghi các điều kiện kích hoạt sự kiện makeUppercase(). Thao tác này sẽ viết hoa phiên bản của chuỗi.

Sau khi triển khai và thực thi các chức năng, bạn có thể xem nhật ký trong bảng điều khiển Google Cloud. Nếu bạn cần xoá hàm trong quá trình phát triển hoặc phát hành chính thức, hãy sử dụng CLI Firebase.

Trong phiên bản phát hành công khai, bạn nên tối ưu hoá khả năng kiểm soát và hiệu suất của chức năng bằng cách đặt số lượng thực thể tối thiểu và tối đa cần chạy. Hãy xem phần Kiểm soát hành vi điều chỉnh theo tỷ lệ để biết thêm thông tin về các tuỳ chọn thời gian chạy này.

Xem lại mã mẫu hoàn chỉnh

Đây là functions/index.js hoàn chỉnh chứa các hàm addMessage()makeUppercase(). Các hàm này cho phép bạn truyền một tham số đến một điểm cuối HTTP ghi một giá trị vào Cloud Firestore, sau đó chuyển đổi giá trị đó bằng cách viết hoa tất cả các ký tự trong chuỗi.

// The Cloud Functions for Firebase SDK to create Cloud Functions and set up triggers.
const functions = require('firebase-functions/v1');

// The Firebase Admin SDK to access Firestore.
const admin = require("firebase-admin");
admin.initializeApp();

// Take the text parameter passed to this HTTP endpoint and insert it into
// Firestore under the path /messages/:documentId/original
exports.addMessage = functions.https.onRequest(async (req, res) => {
  // Grab the text parameter.
  const original = req.query.text;
  // Push the new message into Firestore using the Firebase Admin SDK.
  const writeResult = await admin
    .firestore()
    .collection("messages")
    .add({ original: original });
  // Send back a message that we've successfully written the message
  res.json({ result: `Message with ID: ${writeResult.id} added.` });
});

// Listens for new messages added to /messages/:documentId/original and creates an
// uppercase version of the message to /messages/:documentId/uppercase
exports.makeUppercase = functions.firestore
  .document("/messages/{documentId}")
  .onCreate((snap, context) => {
    // Grab the current value of what was written to Firestore.
    const original = snap.data().original;

    // Access the parameter `{documentId}` with `context.params`
    functions.logger.log("Uppercasing", context.params.documentId, original);

    const uppercase = original.toUpperCase();

    // You must return a Promise when performing asynchronous tasks inside a Functions such as
    // writing to Firestore.
    // Setting an 'uppercase' field in Firestore document returns a Promise.
    return snap.ref.set({ uppercase }, { merge: true });
  });

Các bước tiếp theo

Trong tài liệu này, bạn có thể tìm hiểu thêm về cách quản lý các hàm cho Cloud Functions cũng như cách để xử lý mọi loại sự kiện được Cloud Functions hỗ trợ.

Để tìm hiểu thêm về Cloud Functions, bạn cũng có thể làm những việc sau: