Cloud Functions+Express+EJS로 동적 내용 보내기

Firebase의 공식 참고를 보면 다음과 같은 내용이 적혀 있다.
클라우드 기능을 사용하여 동적 컨텐츠 배포
Firebase Hosting에서는 Cloud Functions를 사용하여 서버 측 처리를 수행할 수 있습니다.즉, Firebase Hosting 사이트 내용의 동적 생성을 지원할 수 있다는 것이다.
보아하니 Firebase Hosting은 동적 사이트를 활용할 수 있는 매우 좋은 서비스이기 때문에 실제적으로 동적 내용의 배신을 진행하였다.
Node.js의 "Express"를 사용합니다.템플릿 엔진은 EJS를 사용합니다.여기'Pug'와'handlebars'는 문제 없어요
Firebase Hosting 환경 구축 포기 설명
자세한 내용은 참조여기

프로젝트 계층


계층은 이런 느낌이다.
├── firebase.json
├── functions
│   ├── firebase-debug.log
│   ├── index.js
│   ├── node_modules
│   │   ├── @types
│   │   ├── ・・・・・・・
│     │     ├── ・・・・・・・
│   ├── package-lock.json
│   ├── package.json
│   └── views
│       └── template.ejs
└── public
    └── index.html

npm에 "Express" 및 "EJS" 설치


express 설치
$ npm install express --save
ejs 설치
$ npm install ejs --save
모두 npm에 설치해야 합니다.

firebase.json 파일


를 열고 다음 코드로 내용을 대체합니다.
firebase.json
{
  "hosting": {
    "public": "public",
    "rewrites": [
       {
         "source": "/**",
         "function": "sample"
       }
    ]
  }
}

함수에 호스트 요청 보내기


다시 쓰기 규칙을 사용하면 특정 패턴과 일치하는 요청을 단일 목적지로 보낼 수 있습니다.firebase.json의 모든 요청을 보내고 /**라는 HTTPS 함수를 실행합니다.
이번 첫 페이지에는 정적 페이지가 표시되며, 방문sample 시 (/page1 및/page2) 와 해당하는 동적 내용을 되돌려줍니다.

public


루트 바로 아래 /** 에서public 디렉터리에 있는 ** 파일을 불러옵니다.
파일 내용은 다음과 같습니다.
index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta http-equiv="content-type">
    <title>トップページ</title>
    <style>
    h1 { font-size:18px; background-color:#eaeaea; }
    </style>
</head>
<body>
    <header>
        <h1 id="h1">トップページ</h1>
    </header>
    <div>
        <p>これはトップページです。</p>
        <ul>
          <li><a href="/page1">ページ1へ</a></li>
          <li><a href="/page2">ページ2へ</a></li>
        </ul>
    </div>
</body>
</html>

HTTPS 함수를 생성하는 indexjs


를 열고 다음 코드로 내용을 대체합니다.여기에서 위의 HTTPS 함수/를 작성합니다.
index.js
const functions = require('firebase-functions');
const express = require('express');
const url = require('url');
const app = express();

const routes = {
    "/page1":{
        "title":"ページ1",
        "content":"これはページ1です。"
    },
    "/page2":{
        "title":"ページ2",
        "content":"これはページ2です。"
    }
};

app.set("view engine","ejs");
app.engine('ejs', require('ejs').__express);

app.get("*",function(req,res){

  const url_parts = url.parse(req.path);

  if(routes[url_parts.pathname] == null){
    res.status(404).send("page not found");
  }else{
    res.status(200).render("template",
      {
          title: routes[url_parts.pathname].title,
          content: routes[url_parts.pathname].content
      }
    );
  }
});

exports.sample = functions.https.onRequest(app);

보기 엔진에 js 설정


다음 섹션:.
app.set("view engine","ejs");
app.engine('ejs', require('ejs').__express);

루트 디렉토리에 데이터 요약


페이지당 데이터를 index.html 변수로 요약합니다.
방문한 path를 키로 하고 이 path에 표시된 페이지 정보를 관련 그룹의 값으로 설정합니다.
이 변수에서 각 경로에 필요한 정보를 로드하고 처리합니다.
const routes = {
    "/page1":{
        "title":"ページ1",
        "content":"これはページ1です。"
    },
    "/page2":{
        "title":"ページ2",
        "content":"これはページ2です。"
    }
};

URL 객체 로드


URL 대상을 불러옵니다.원근 URL 문자열에 사용됩니다.
const url = require('url');

원근 액세스 URL


원근 및 변환 변수 /functions/index.js.
const url_parts = url.parse(req.path);

판정


액세스할 path를 결정합니다sample. 일치하지 않으면 404를 보내고, 일치하면 JSON을 사용하여 routes 변수에 기반한 데이터를 보내고 템플릿을 렌더링합니다.
if(routes[url_parts.pathname] == null){
    res.status(404).send("page not found");
}else{
    res.status(200).render("template",
      {
          title: routes[url_parts.pathname].title,
          content: routes[url_parts.pathname].content
      }
    );
}

템플릿 파일 준비


functions 디렉터리에views 디렉터리를 만들고 routes 파일을 만듭니다.파일 내용은 다음과 같습니다.
template.ejs
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta http-equiv="content-type">
    <title><%=title %></title>
    <style>
    h1 { font-size:18px; background-color:#eaeaea; }
    </style>
</head>
<body>
    <header>
        <h1 id="h1"><%=title %></h1>
    </header>
    <div>
        <p><%-content %></p>
        <ul>
          <li><a href="/">トップページへ</a></li>
        </ul>
    </div>
</body>
</html>

배포 후 결과

url_parts 정적 첫 페이지를 표시하고 방문routes[url_parts.pathname]routes 후 각 URL에 해당하는 내용을 동적 페이지로 표시합니다.


총결산


Firebase Hosting에서 Cloud Functions를 사용하면 동적 사이트를 실제로 활용할 수 있습니다.
그리고 공짜예요.
Firebase에 제한이 많다고 생각하지만 이렇게 하면 AWS Lambda보다 더 쉽고 유연한 응용 프로그램을 만들 수 있을 것 같습니다.Firebase Realtime Database와 결합합니다.

좋은 웹페이지 즐겨찾기