지금까지는 Firebse 호스팅을 사용하는 기본적인 사용법을 정리하였다.

여기에서는 앞서 작성한 게시판 예제를 Firebse 호스팅에 적용하는 방법을 정리한다.

1. 시작하기

2. Realtime Database 기반 게시판

3. Cloud Firestore (beta) 기반 게시판

4. 로그인 (authentication) 기능 추가

5. 무료 호스팅(Firebase Hosting)으로 배포 I, II

앞서의 예제는 Express 프레임워크 기반으로 개발되어 Firebse 호스팅에서 그대로 사용할 수 없다.

Express 프레임워크을 사용하기 위해서는 몇 가지 설정을 수정해야 한다.


먼저, firebaseHosting 폴더에 있는 firebase.json 파일을 열어서 다음과 같이 수정해 준다.

{
  "firestore": {
    "rules": "firestore.rules",
    "indexes": "firestore.indexes.json"
  },
  "functions": {
    "predeploy": [
      "npm --prefix \"$RESOURCE_DIR\" run lint"
    ]
  },
  "hosting": {
    "public": "public",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "rewrites": [
       {
         "source": "/**",
         "function": "api1"
       }     
    ]
  }
}

firebase.json

새로 입력되는 URL들을 api1이라는 함수를 호출해서 사용하겠다는 의미이다.


firebaseHosting 폴더 하위의 index.js 파일도 다음과 같이 수정한다.

const functions = require('firebase-functions');

const express = require("express")

const app1 = express();

app1.get("/hello", (request, response) => {
  response.send("Hello from Express on Firebase!")
})

const api1 = functions.https.onRequest(app1)

module.exports = {
  api1
}

index.js

첫 줄을 제외하고 모두 추가한 코드이다.

express에서 제공하는 방식으로 코드를 작성하고,

functions 함수를 이용하여 생성한 api1을 firebase.json 설정으로 넘기는 코드이다.

Firebase 호스팅에서는 express를 Firebase functions을 통하여 구현한다.


express가 로컬에 글로벌로 설치된 경우에는 별도 설치를 하지 않아도 functions폴더 하위의 node_modules에 추가 되어있다.

다만, npm으로 다시 설치하지 않으면 package.json 파일에 express 정보가 등록되어 있지않아 배포시 오류가 발생한다.

직접 package.json 파일에 express 정보를 등록하거나, npm install express --save로 설치해서 등록한다.


이상의 코드에서는 hello라는 URL을 추가했다.

웹 브라우저에서 http://localhost:5000/hello를 입력해서 그림과 같이 출력되면 제대로 설정된 것이다.



지금까지 Firebase 호스팅에서 express를 사용하는 방법을 정리하였고,

이번에는 앞서 작성한 게시판 예제(board2)를 추가해서 구현한다.

app.js에서 했던 것처럼 index.js 파일에 board.js 파일을 가져오기 하도록 설정하고,

ejs도 사용한다고 설정해 주어야 한다.

const functions = require('firebase-functions');
const express = require("express")
const app1 = express();

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

app1.get("/hello", (request, response) => {
  response.send("Hello from Express on Firebase!")
})

app1.use('/board2', require('./board2'));

const api1 = functions.https.onRequest(app1)

module.exports = {
  api1
}

index.js

다음으로 ejs 라이브러리를 설치 한다.

앞서의 예제들은 HTML 처리 부분을 모두 ejs로 구현하였다.

일반적인 Node.js에서는 express를 설치하면 별도로 ejs를 설치하지 않아도 되지만,

Firebase 호스팅을 사용하기 위한 Node.js에서는 다음과 같이 별도로 설치해야 한다.

단, functions 폴더로 이동해서 실행해야 한다 (이유는 앞서 정리).

> cd functions

> npm install ejs --save


이외에도 board2.js에서 추가로 사용한 dateformat 라이브러리를 설치해야 한다.

> npm install dateformat --save


functions폴더 하위에 view 폴더를 생성하고,

앞서 작성한 예제(firebaseExample)의 view 폴더 하위의 board2 폴더를 복사해서 넣어준다.

route폴더의 board2.js 파일도 functions 폴더에 복사한다.

로그인 기능이 있는 board3을 복사해도 되지만, 조금더 단순한 board2을 배포한다.


다음으로 Firebase Admin SDK를 설치한다.

> npm install firebase-admin --save

지금까지 Firestore를 웹으로 접근하는 방법을 사용했지만,

Firestore 문서에서는 Node.js일 경우 Firebase Admin을 이용하여 접속하도록 하고 있다.

주의: 설치시 반드시 --save 옵션으로 package.json에 설치된 라이브러리 정보가 저장되도록 해야 한다.

그렇지 않으면 배포(deploy)시 정보를 찾을 수 없다는 오류가 발생한다.


접속 및 초기화 하는 여러가지 방법을 제공하는데, Cloud 함수에서 초기화하는 다음 코드를 이용한다.

const admin = require('firebase-admin');
const functions = require('firebase-functions');

admin.initializeApp(functions.config().firebase);

var db = admin.firestore();


이 코드를 board2.js에 다음과 같이 추가한다.

var express = require('express');
var router = express.Router();
var dateFormat = require('dateformat');

const admin = require('firebase-admin');
const functions = require('firebase-functions');

admin.initializeApp(functions.config().firebase);

var db = admin.firestore();

router.get('/', function(req, res, next) {
    res.redirect('boardList');
});

router.get('/boardList', function(req, res, next) {

    ~~ 생략 ~~

board2.js

apiKey등 기존의 접속 정보를 사용하지 않는다.

이미 로컬에서 firebase login인으로 Firebase 서버에 접속이 되어 있고,

firebase init로 폴더를 프로젝트로 초기화 할때 기본적인 설정이 모두 되어 있기 때문이다.


firebase serve로 서버를 재가동하고,

웹 브라우저에서 http://localhost:5000/board2/boardList로 접속해서 잘 동작하는 지 글쓰기나 수정작업을 해 본다.


서버를 중지하고, firebase deploy로 Firebase Hosting 서버에 배포하도록 실행한다.


이상의 그림과 같이 eslint가 찾아낸 6개의 경고와 6개의 오류가 발생하면서 배포가 중지된다.

Eslint는 코딩 스타일을 점검하는 라이브러리로,

인터넷에 자료가 많으니 자세한 사용법은 검색해 보길 바라고, 여기에서는 간단하게 정리하고 넘어간다.


화면 중앙의 빨간색 메시지 위가 오류와 경고에 대한 정보를 나타내는 것으로

숫자: 숫자는 오류가 발생한 행과 열의 번호를 의미하고

다음의 단어는 오류(error)인지 경고(warning)를 의미한다.

그 다음의 문자열은 오류에 대한 구체적인 메시지를 나타내고

마지막 문자열(예: prefer-arrow-callback)은 오류의 이름 (규칙명)을 의미한다.

사실 Eslint는 코딩 스타일을 규정하는 것으로 실제 오류가 발생한 것은 아니기 때문에 앞서서 개발할 때에는 별 문제가 없었다.

Firebase deploy시에는 코딩 스타일 준수를 요구하는데,

오류(error)라기 보다는 규칙(rule) 위반으로 심각한 문제를 발생시킬 수 있다는 의미이다.


6개의 경고는 빨간색 메시지(6 warnings potentially fixable with the `--fix` option)처럼 Eslint 실행시 –fix 옵션을 주면 자동으로 수정된다.

자세히 살펴보면, 6개의 경고가 발생했지만

경고 종류는 하나로 콜백 함수보다는 화살표 함수 표현(arrow function expression)을 사용하라는 의미이다.

기존: router.get('/boardList', function(req, res, next) {

수정: router.get('/boardList', (req, res, next) => {

경고는 수정하지 않아도 Firebase에서 배포가 되므로 수정하지 않고 넘어간다.


경고를 수정하고 싶은 경우나 다시 오류를 확인하고 싶은 경우 firebase deploy를 실행시키기 보다는 eslint를 직접 실행하는 것이 좋다.

eslint는  functions 폴더 하위의 node_modules\.bin 폴더에 명령어가 설치되어 있다.

따라서 현재 폴더가 functions 일 경우, 다음과 같은 문장으로 문제점을 수정할 수 있다.

          node_modules\.bin\eslint ../../board2.js --fix



6개의 오류지만 오류로 지정된 행을 소스 코드에서 찾아보면 3가지 오류인 것을 알 수있다.

1. then()을 사용한 경우 마지막에 return을 사용하거나 throw을 사용: promise/always-return

2. (then() 다음에) catch() 사용: promise/catch-or-return

3. doc 변수 선언이 두 번 되었음: no-redeclare


.eslintrc.json 파일을 열어서 주어진 규칙명으로 규칙을 경고(1)나 사용하지 않음(off 또는 주석처리) 표시해도 된다.

여기에서는 다음과 같이 프로그램 코드를(빨간색) 수정하였다.

router.get('/boardList', function(req, res, next) {
    db.collection('board').orderBy("brddate", "desc").get()
        .then((snapshot) => {
            var rows = [];
            snapshot.forEach((doc) => {
                var childData = doc.data();
                childData.brddate = dateFormat(childData.brddate, "yyyy-mm-dd");
                rows.push(childData);
            });
            res.render('board2/boardList', {rows: rows});
            return;
        })
        .catch((err) => {
            console.log('Error getting documents', err);
        });
});

router.get('/boardRead', function(req, res, next) {
    db.collection('board').doc(req.query.brdno).get()
        .then((doc) => {
            var childData = doc.data();
           
            childData.brddate = dateFormat(childData.brddate, "yyyy-mm-dd hh:mm");
            res.render('board2/boardRead', {row: childData});
            return;
        })
        .catch((err) => {
            console.log('Error getting documents', err);
        });
});

router.get('/boardForm', function(req,res,next){
    if (!req.query.brdno) { // new
        res.render('board2/boardForm', {row: ""});
        return;
    }
   
    // update
    db.collection('board').doc(req.query.brdno).get()
        .then((doc) => {
            var childData = doc.data();
            res.render('board2/boardForm', {row: childData});
            return;
        })
        .catch((err) => {
             console.log('Error getting documents', err);
        });
});

router.post('/boardSave', function(req,res,next){
    var postData = JSON.parse( JSON.stringify(req.body));
    var doc = null;
    if (!postData.brdno) {  // new
        postData.brddate = Date.now();
        doc = db.collection("board").doc();
        postData.brdno = doc.id;
        doc.set(postData);
    } else {                // update
        doc = db.collection("board").doc(postData.brdno);
        doc.update(postData);
    }
   
    res.redirect('boardList');
});

board2.js

추가적으로 Cloud Firestore 게시판 예제에서 정리(하단의 주의 참고)하였지만, 

Firebase 호스팅은 Node.js 6 을 지원하기 때문에 사용자가 작성한 데이터(req.body)를 그대로 저장(set, update)하면 오류가 발생한다.

따라서, 위 코드의 파란색 코드처럼 Json 변환을 해주어야 한다.


다시 배포를 진행해서 "Deploy complete"가 출력되는지 확인한다.

경고가 있어도 배포는 잘 이루어진다.


Firebase 콘솔의 Hosting 메뉴에서 배포한 기록이 등록되었는지 확인한다.

배포가 잘 이루어진 경우 모든 배포 기록이 등록되어 있다.



웹 브라우저에서 firebase 호스팅에서 제공하는 도메인으로 접속해 본다.

https://fir-example-ec491.firebaseapp.com/board2/boardList











  1. 이전 댓글 더보기
  2. 오류 2019.08.25 18:06

    올려주신 코드에 오류가 있는 거 같습니다.

    router.get('/boardList', function(req, res, next) {
    db.collection('board').orderBy("brddate", "desc").get()
    .then((snapshot) => {
    var rows = [];
    snapshot.forEach((doc) => {
    // var childData = doc.data(); // 원래 코드
    var childData = new Date();
    childData.brddate = dateFormat(childData.brddate, "yyyy-mm-dd");
    //rows.push(doc.data()); 원래 코드

    rows.push(doc.data());

    //console.log("childData.brddate: "+childData.brddate);
    //console.log("doc.data(): "+doc.data());
    //console.log("rows: "+JSON.stringify(rows));

    console.log(doc.date())



    타입이 다르다는 오류가 간헐적으로 발생해서

    firebase serve 켜고 console.log(doc.date()) 찍어본 결과 출력되는 순서가 다릅니다.

    즉 board2/boardList 에서 새로고침을 할 때마다 순서가 바뀝니다. 그래서 Type 오류가 발생합니다.

    • ww 2019.08.25 18:28

      또한


      Error: could not handle the request

      이 오류도 발생하는 것을 확인했습니다.

    • forest71 2019.08.25 18:43 신고

      [오류]님
      doc.data()는 Firestore에서 데이터를 가지고 오는 코드입니다.
      사용하신 Date는 자바스크립트 날짜 클래스 입니다.
      전혀 다른 코드이니, 원 코드에서 발생하는 오류를 다시 확인해 보세요

    • forest71 2019.08.25 18:44 신고

      ww님 오류가 너무 짧습니다. 어떤 오류인지 알수가...

  3. 오류 2019.08.25 18:58

    명령프롬프트 창에서 firebase deploy 를 이용하여 배포를 하고

    https://*****-*****.firebaseapp.com/board2/boardForm 에서 새로운 글을 추가하면

    추가가 되는 것을 확인했지만

    locallhost:5000/board2/boardForm 에서 새로운 글을 추가하면 적용이 안됩니다.

    또한 현재
    https://********-******.firebaseapp.com/board2/boardList로 접속할 때 다음과 같은 오류가 발생합니다.

    Error: could not handle the request

    • forest71 2019.08.25 19:05 신고

      로컬(localhost)에서 접속하실때는 Node.js를 가동하고(firebase serve) 접속해 보세요.


      boardList만 접속 되지 않는 경우, 서버에서 접속하시면 로그 확인이 어려우니 로컬로(firebase serve) 실행해서 에러 로그를 확인해 보세요

  4. 오류 2019.08.25 19:12

    Error: could not handle the request 에 대한 오류는 찾았지만


    localhost 에서 접속했을 때 글 추가, 삭제, 수정 기능이 작동하지 않습니다.

    오류 페이지가 나오지 않아 찾기 어렵네요

    • forest71 2019.08.25 19:13 신고

      콘솔창에 나올겁니다.
      또는 개발자 도구(F12)를 열어서 확인해 보세요

  5. 오류 2019.08.25 19:17


    다시 해봤지만 localhost 로 접속할 때 글 추가가 안됩니다.

    오류가 발생하지 않고 콘솔창에도 오류 메시지가 나타나지 않습니다.

    아무런 오류도 없이 기존의 글 목록(boardList) 페이지로 넘어갑니다.

    • forest71 2019.08.25 19:19 신고

      말씀만으로는 더이상 도움을 드리기 어렵습니다.

      지금 비밀글로 팀뷰어 접속 정보를 알려주시면
      접속해서 직접 보고 말씀을 드리겠습니다.

  6. 2019.08.25 19:25

    비밀댓글입니다

  7. 2019.08.25 19:26

    비밀댓글입니다

    • forest71 2019.08.25 20:20 신고

      연결을 해제하고 보니, 잘 되다 안되다 하실 것 같습니다.

      글 저장시 사용되는 doc.set(postData)와 doc.update(postData)이 느려서 그럴 수 있습니다.
      아직 저장이 안 됐는데 하단의 res.redirect('boardList')이 실행되면서,
      글 리스트로 이동해서 제대로 저장이 안되어서 그럴 수 있습니다.
      Set을 다음과 같이 수정해서 사용해서 해보세요.
      db.collection("board").doc(doc.id).set(postData)
      .then(function() {
      res.redirect('boardList');
      })
      .catch(function(error) {
      console.error("Error writing document: ", error);
      });
      수정도 이렇게 하시면 됩니다.

      참고 문서: https://firebase.google.com/docs/firestore/manage-data/add-data?hl=ko

  8. 2019.08.25 20:11

    비밀댓글입니다

  9. 2019.08.25 21:27

    비밀댓글입니다

    • forest71 2019.08.25 21:43 신고

      doc = db.collection("board").doc(doc.id).set(postData) 부분을

      db.collection("board").doc().set(postData)으로 하시거나 (저장시 키-ID가 생성되는 방식)
      기존처럼
      doc = db.collection("board").doc();
      postData.brdno = doc.id;
      db.collection("board").doc(doc.id).set(postData)으로 하시거나 (키-ID 할당 받고 저장)
      둘 중에 하나를 사용하시면 됩니다.
      앞 방식이 간단해서 사용하기 좋으시고
      뒷 방식은 나중에 첨부 파일등을 구현할때 사용하는 방식입니다.

      다른 분들도 비슷한 일이 생길 수 있습니다.
      참고할 수 있도록 공개로 해주세요

  10. 오류2 2019.08.25 21:48

    // 글 저장하기
    router.post('/boardSave', function(req,res,next){
    var postData = JSON.parse( JSON.stringify(req.body));
    var doc = null;
    if (!postData.brdno) { // new
    postData.brddate = Date.now();
    doc = db.collection("board").doc();
    postData.brdno = doc.id;
    db.collection("board").doc(doc.id).set(postData)
    .then(function() {
    console.log("글 추가 완료!")
    res.redirect('boardList');
    })
    .catch(function(error) {
    console.error("Error writing document: ", error);
    });

    // console.log(postData.brdno);
    // console.log(postData.brdtitle);
    } else { // update
    doc = db.collection("board").doc(postData.brdno);
    doc.update(postData);
    }

    // res.redirect('boardList');
    });


    위와 같이 고치니까 되네요.

    참고하라고 남겨주신 링크 잘 봤습니다.

    여러모로 감사드립니다 :)

    하지만

    // 글 목록보기
    router.get('/boardList', function(req, res, next) {
    (이하 생략)
    ..
    ...

    var childData = doc.data(); 이 부분에서 Type 에러가 발생하는 것은 고쳐지지 않습니다ㅠ 저만 오류 나는 걸끼요..

    • forest71 2019.08.25 21:52 신고

      소스를 새로 받으시고 firestore의 데이터도 지우고, 처음부터 해보세요.

      그래도 안되시면 내일 저녁 10시반쯤 팀뷰어 접속 정보를 남겨 주세요.
      다시 접속해서 보겠습니다.

  11. 2019.08.25 22:04

    비밀댓글입니다

  12. 오류2 2019.08.26 09:02

    원인은 작성일(brddate)의 타입이라는 걸 알았고.Update(글 추가) 부분을 수정해서 타입 오류를 해결했습니다.

    그런데 파이어베이스에 호스팅을 배포하고 웹 주소로 들어가면 날짜형식이 아닌 숫자(155373848 와 같은)로 나옵니다..

    • forest71 2019.08.26 23:03 신고

      작성일자(brddate)를 Firestore에서 날짜형(timestamp)로 지정해서 사용하시면 오류가 생기실 겁니다.
      Firestore에서 제공하는 날짜형(timestamp)은 다른 형태로, 여기에서는 숫자(number)으로 사용하고 있습니다.
      별도의 지정을 하지 않으면 저장되는 값이 숫자라 기본적으로 숫자가 지정됩니다.
      날짜 값이 숫자인 이유는 JS의 Date형으로 반환 받은 값이라서 그렇습니다.
      날짜를 숫자로 저장하고 화면에 출력 할 때는 formatdate 함수로 바꿔서 보여주게 작성했습니다.

  13. 오류2 2019.08.28 12:08

    오류를 수정했습니다.

    정보를 저장할 때 Number 타입으로 저장해서 날짜가 숫자로 나온 거였습니다.

    답변 감사합니다.

  14. 뿌구루 2019.09.14 01:14

    node.js 를 다뤄보고 싶어도 초심자라 정말 삽질만 하고, 배포에서도 계속 삽질만했는데요.
    올려주신 글이 정말 많이 도움이 됐습니다. ㅠㅠㅠㅠㅠㅠㅠㅠ 너무 감사드려요. 꼭 댓글 남기고 싶어서
    작성하신지 좀 된 글이지만 남깁니다 정말 감사합니다!

  15. hosting초보 2019.11.20 11:59

    Error getting documents Error: Could not load the default credentials. Browse to https://cloud.google.com/docs/authentication/getting-started for more information.
    > at GoogleAuth.getApplicationDefaultAsync (C:\retry\functions\node_modules\google-auth-library\build\src\auth\googleauth.js:161:19)
    > at process._tickCallback (internal/process/next_tick.js:68:7)



    boardlist 실행시 이런 에러가 나는데 인증페이지 고대로 따라했거든요ㅠㅠ 왜일까요ㅠㅠ

    • forest71 2019.11.20 22:13 신고

      뭔가 로그인(인증)이 제대로 되지 않은 것 같습니다.
      다음 글에서 firebase-tools을 설치 하시면서, 로그인이 제대로 되었는지 확인해 보세요.
      https://forest71.tistory.com/169?category=667022

      그래도 안된다면 처음부터 다시 해보면서 빠진 것이 없는지 확인하셔야 할 것 같니다.

  16. whatismyproblem 2019.11.22 17:52

    Error setting up the execution environment for your function. Please try deploying again after a few minutes.
    Functions deploy had errors with the following functions:
    api1

    몇분뒤에 시도를 몇번이고 해봐도 이런 에러가 나는 이유를 알 수 있을까요?
    6개의 경고 따라서 수정하고나서부터 나는 에러입니다.

    • forest71 2019.11.22 21:38 신고

      Express 를 Firebase에서 사용하기 위해 function을 api1로 선언해서 사용하는데, 관련 부분에 오타가 있거나 빠진 부분이 있는 것 같습니다.
      다시 잘 확인해 보세요

  17. whatismyproblem 2019.11.25 00:50

    소스를 복붙했는데도 저 에러가 나네요...

    • forest71 2019.11.25 21:59 신고

      firebase에서 function을 사용할 수 있도록 해야 합니다. 다시 한번 확인해 보세요
      https://forest71.tistory.com/169

  18. seokwon 2019.11.29 10:31

    그럼 처음에 만든 firebaseExample 는 프로젝트 구조가 잡혀 있어서 편하게 쓰려고 만든거고 실제로는 필요없는거네요?

    • forest71 2019.11.29 21:59 신고

      처음에 만든 firebaseExample라는게 무엇을 의미하는 겁니까?
      상세하게 말씀해 주세요

  19. Hotmelon 2019.12.04 10:51


    안녕하세요
    hello부분까지 잘 적용이됩니다만
    board2/boardList부분을 로드를 못합니다. 혹시 무엇이 에러인지 알수있을까요

    Error getting documents Error: Could not load the default credentials. Browse to https://cloud.google.com/docs/authentication/getting-started for more information.
    > at GoogleAuth.getApplicationDefaultAsync (C:\Users\user\firebaseHosting\functions\node_modules\google-auth-library\build\src\auth\googleauth.js:161:19)
    > at processTicksAndRejections (internal/process/task_queues.js:93:5)
    > at async GoogleAuth.getClient (C:\Users\user\firebaseHosting\functions\node_modules\google-auth-library\build\src\auth\googleauth.js:503:17)
    > at async GrpcClient._getCredentials (C:\Users\user\firebaseHosting\functions\node_modules\google-gax\build\src\grpc.js:108:24)
    > at async GrpcClient.createStub (C:\Users\user\firebaseHosting\functions\node_modules\google-gax\build\src\grpc.js:229:23)

    • forest71 2019.12.05 22:19 신고

      구글 인증(googleauth)에 오류가 있다고 하는 걸 봐서는 Firebase 연동이 잘 안된 것 같습니다.
      이전 글인 "무료 호스팅(Firebase Hosting)으로 배포 I"을 제대로 따라 하셨는지 확인해 보세요.

  20. 파베초 2020.03.12 20:49

    Error: Cannot find module 'firebase'
    C:\Users\gyejs\HwadaeHosting\functions\board2.js
    - C:\Users\gyejs\HwadaeHosting\functions\index.js
    - C:\Users\gyejs\AppData\Roaming\npm\node_modules\firebase-tools\lib\emulator\functionsEmulatorRuntime.js
    ~생략~
    오류가 뜨는데 뭐가 문제일까요?
    express ejs 등 다 설치했고
    호스팅 - 펑션 폴더에 board2.js파일 있고
    펑션 - 뷰 폴더안에 board2 폴더를 옮겨놨습니다.

    • forest71 2020.03.12 21:55 신고

      firebase를 설치하셨습니까?
      다음과 같이 설치하고 실행해보세요.
      npm install firebase --save

  21. 어려워요 2020.03.13 13:24

    처음부터 정독했습니다
    마지막 deploy과정에서
    Error: Error occurred while parsing your function triggers.
    오류가 마지막에 뜨는데 왜이럴까요?

    • forest71 2020.03.13 20:54 신고

      firebase-tool이 제대로 설치 되지 않은 것 같습니다.
      다음 내용을 참고하시면 될 것 같습니다.
      https://stackoverflow.com/questions/49695593/firebase-functions-deploy-error-occurred-while-parsing-your-function-triggers

+ Recent posts