functions.https
를 사용해 HTTP 요청으로 함수를 트리거할 수 있습니다. 이렇게 하면 GET
, POST
, PUT
, DELETE
, OPTIONS
등 지원되는 HTTP 메서드를 통해 동기 함수를 호출할 수 있습니다.
이 페이지의 예시는 함수 엔드포인트로 HTTP GET
요청을 보낼 때 트리거되는 샘플 함수를 기반으로 합니다. 샘플 함수는 현재 서버 시간을 가져오고, URL 쿼리 매개변수에 지정된 대로 시간 형식을 지정하고, HTTP 응답으로 결과를 보냅니다.
HTTP 요청으로 함수 트리거
functions.https
를 사용하여 HTTP 이벤트를 처리하는 함수를 만듭니다. HTTP 함수의 이벤트 핸들러는 Express 웹 프레임워크로 관리되는 라우터와 앱을 지원하는 onRequest()
이벤트를 수신 대기합니다.
Express 요청 및 응답 객체 사용
onRequest()
의 인수로 사용되는 요청 객체는 클라이언트에서 보낸 HTTP 요청의 속성에 대한 액세스 권한을 부여하고 응답 객체는 클라이언트로 응답을 다시 보내는 방법을 제공합니다.
exports.date = functions.https.onRequest((req, res) => { // ... });
기존 Express 앱 사용
App을 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
함수를 배포할 때 권한 오류가 발생하면 배포 명령어를 실행하는 사용자에게 적절한 IAM 역할이 할당되었는지 확인합니다.
Express 앱 라우팅에서는 정의한 앱의 URL 경로에 함수 이름이 프리픽스로 추가됩니다. 예를 들어 위의 Express 앱 예시에서 getter를 호출하는 URL은 다음과 같습니다.
https://us-central1-<project-id>.cloudfunctions.net/widgets/<id>
방화벽 또는 IP 필터 뒤에서 HTTP 함수를 호출하면 Google에서 HTTP 함수를 제공하는 데 사용하는 IP 주소를 조회할 수 있습니다.
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 함수 종료
항상 send()
, redirect()
또는 end()
로 HTTP 함수를 종료합니다. 그렇지 않으면 함수가 계속 실행되고 시스템에 의해 강제로 종료될 수 있습니다. 동기, 비동기, 프로미스도 참조하세요.
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에 연결하는 방법에 대해 자세히 알아보세요.