HTTP 요청을 통한 함수 호출

1세대와 마찬가지로 onRequest() 핸들러를 사용하여 HTTP 요청을 통해 함수를 트리거할 수 있습니다. 이렇게 하면 GET, POST, PUT, DELETE, OPTIONS 등 지원되는 HTTP 메서드를 통해 함수를 호출할 수 있습니다.

추가 HTTP 옵션

옵션 설명
region HTTP 함수는 단일 리전과 여러 리전을 지정할 수 있습니다. 여러 리전이 지정되면 리전별로 별도의 함수 인스턴스가 배포됩니다.
timeoutSeconds HTTP 함수에서 최대 1시간의 제한 시간을 지정할 수 있습니다.
cors HTTP 함수가 CORS 정책을 지정할 수 있습니다. true로 설정하면 모든 출처가 허용되고, string, regex, array를 설정하면 허용된 출처를 지정할 수 있습니다. 명시적으로 설정하지 않으면 기본값은 false/CORS 정책 없음입니다.

CORS 구성(교차 출처 리소스 공유)

cors 옵션을 사용하여 함수에 액세스할 수 있는 출처를 관리하세요. 기본적으로 HTTP 함수에는 CORS가 구성되어 있지 않습니다. 즉, 함수에 관한 교차 출처 요청으로 인해 이 오류가 발생합니다.

request has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

함수의 cors 옵션을 false로 설정하여 CORS를 명시적으로 사용 중지할 수도 있습니다.

일부 교차 출처 요청만 허용하려면 허용하는 특정 도메인 또는 정규 표현식의 목록을 전달하면 됩니다. 예를 들어 개발자가 firebase.comflutter.com 도메인을 소유한 경우, firebase.com에 여러 하위 도메인이 있을 수 있으므로 cors 옵션을 [/firebase\.com$/, 'flutter.com']으로 설정하는 것이 좋습니다.

함수를 공개적으로 사용할 수 있어야 하는 경우(예: 공개 API 또는 웹사이트를 제공하는 경우) cors 정책을 true로 설정하세요.

HTTP 요청으로 함수 트리거

firebase-functions/v2/https 하위 패키지의 onRequest()를 사용하여 HTTP 이벤트를 처리하는 함수를 만듭니다. onRequest() 이벤트는 Express 웹 프레임워크로 관리되는 라우터와 앱을 지원합니다.

이 페이지의 예시는 함수 엔드포인트로 HTTP GET 요청을 보낼 때 트리거되는 시간 서버 샘플을 기반으로 합니다. 샘플 함수는 현재 서버 시간을 가져오고, URL 쿼리 매개변수에 지정된 대로 시간 형식을 지정하고, HTTP 응답으로 결과를 보냅니다.

Express 요청 및 응답 객체 사용

onRequest()의 인수로 사용되는 요청 객체는 클라이언트에서 보낸 HTTP 요청의 속성에 대한 액세스 권한을 부여하고 응답 객체는 클라이언트로 응답을 다시 보내는 방법을 제공합니다.

exports.date = onRequest(
    {timeoutSeconds: 1200, region: ["us-west1", "us-east1"]},
    (req, res) => {
  // ...
});

기존 Express 앱 사용

ApponRequest()의 인수로 사용하면 전체 Express 앱을 HTTP 함수에 전달할 수 있습니다.

const { onRequest } = require('firebase-functions/v2/https');

const express = require('express');
const app = express();

// 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 = onRequest(app);

HTTP 함수 호출

HTTP 함수를 배포한 후 함수의 고유 URL을 통해 함수를 호출할 수 있습니다. 배포 후 CLI의 정확한 URL 출력을 사용합니다.

예를 들어 date()를 호출하는 URL은 다음과 같습니다.

https://date-<random-hash>-<region>.a.run.app

Express 앱 라우팅에서는 정의한 앱의 URL 경로에 함수 이름이 프리픽스로 추가됩니다.

요청의 값 읽기

date() 함수 예시에서는 함수가 URL 매개변수와 본문에서 모두 format 값을 테스트하여 사용할 날짜 및 시간 형식을 설정합니다.

let format = req.query.format;
format = req.body.format;

HTTP 함수 종료

항상 send(), redirect() 또는 end()로 HTTP 함수를 종료합니다. 그렇지 않으면 함수가 계속 실행되고 시스템에 의해 강제로 종료될 수 있습니다. 동기, 비동기, 프로미스도 참조하세요.

Node.js moment 모듈을 사용하여 서버 시간을 가져오고 형식을 지정한 후 date() 함수가 HTTP 응답으로 결과를 전송하며 종료됩니다.

const formattedDate = moment().format(`${format}`);
logger.log("Sending formatted date:", formattedDate);
res.status(200).send(formattedDate);

Firebase 호스팅 통합

Firebase 호스팅에 HTTP 함수를 연결할 수 있습니다. Firebase 호스팅 사이트상의 요청은 특정 HTTP 함수로 프록시 처리될 수 있습니다. 이를 통해 HTTP 함수로 커스텀 도메인을 사용할 수도 있습니다. Firebase 호스팅에 Cloud Functions 연결에 대해 자세히 알아보세요.