콘솔로 이동

HTTP 요청을 통한 함수 호출

functions.https를 사용해 HTTP 요청으로 함수를 트리거할 수 있습니다. 이 방식을 사용하면 GET, POST, PUT, DELETE, OPTIONS 등 지원되는 HTTP 메소드를 통해 동기 함수를 호출할 수 있습니다.

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

HTTP 요청으로 함수 트리거

functions.https를 사용하여 HTTP 이벤트를 처리하는 함수를 만듭니다. HTTP 함수의 이벤트 핸들러는 Express 웹 프레임워크에서 관리되는 라우터와 앱을 지원하는 onRequest() 이벤트를 리슨합니다.

Express 요청 및 응답 객체 사용

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

exports.date = functions.https.onRequest((req, res) => {  // ...
});

기존 Express 앱 사용

onRequest()의 인수로 사용하면 전체 Express 앱을 HTTP 함수에 전달할 수 있습니다. 다음과 같이 상용구 코드를 미들웨어로 이동할 수 있습니다.

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 프로젝트 ID
  • cloudfunctions.net
  • 함수 이름

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

https://us-central1-<project-id>.cloudfunctions.net/date

Express 앱 라우팅에서는 정의되는 앱의 URL 경로에 함수 이름이 프리픽스로 추가됩니다. 예를 들어 위의 Express 앱 예시에서 getter를 호출하는 URL은 다음과 같습니다.

https://us-central1-<project-id>.cloudfunctions.net/widgets/<id>

Cloud Functions로 미들웨어 모듈 사용

쿠키 지원 또는 CORS 등을 위해 미들웨어 종속 항목을 삽입해야 하는 경우 함수 내에서 호출합니다. 예를 들어 CORS 지원을 사용 설정하려면 다음 블록을 추가합니다.

// Enable CORS using the `cors` express middleware.
return cors(req, res, () => {  // ...
});

요청의 값 읽기

요청의 본문은 content-type 헤더를 기준으로 자동으로 파싱되고 HTTP 함수의 인수를 통해 사용할 수 있습니다.

다음 표에는 몇 가지 일반적인 시나리오가 나와 있습니다.

콘텐츠 유형 요청 본문 동작
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"}'

그러면 전송된 데이터가 다음과 같이 구체화됩니다.

속성/메소드
request.method 'POST'
request.get('x-myheader') '123'
request.query.foo 'baz'
request.body.text 'something'
request.rawBody 요청의 파싱되지 않은 원시 바이트

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

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

HTTP 함수 종료

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

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

const formattedDate = moment().format(format);
console.log('Sending Formatted date:', formattedDate);
res.status(200).send(formattedDate);

Firebase 호스팅에 HTTP 함수 연결

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