본문 바로가기

일::개발

firebase functions node.js

한참 전에 올려놓았던 firebase function이 언제부턴가 돌아가지 않는 것을 뒤늦게 알고 원인을 찾아 수정하려고 보니 로컬 emulator를 통한 디버깅부터 deploy 까지 뭔가 제대로 되지 않는다.

얼마 전까지 google cloud functions는 잘 되는 환경이었는데? 하고 생각해보니 그건 python 이었지...

 

하여간 여러 가지 문제가 있었는데, 몇 시간 삽질 끝에 해결해서 과정을 정리해둔다.

 

1. Java version

❯ firebase emulators:start --inspect-functions
⬢ emulators: firebase-tools no longer supports Java version before 11. Please upgrade to Java version 11 or above to continue using the emulators.
i emulators: Shutting down emulators.

Error: firebase-tools no longer supports Java version before 11. Please upgrade to Java version 11 or above to continue using the emulators.
...
❯ java -version
java version "1.8.0_331"
Java(TM) SE Runtime Environment (build 1.8.0_331-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.331-b09, mixed mode)

 

firebase 명령을 주면 Java 를 11 버전 이후로 올리라고 에러 메시지가 뜬다. 하지만 나의 자바는 1.8.0 이라고...

아주 오래 전 기억 속에 자바의 버전 시스템이 일반인은 이해할 수 없는 이상한 체계였던 것이 기억난다.

 

하지만 하라니 일단 자바를 업그레이드 해보려 했지만, 

 

별도창에서 열린다고 해놓고 안 열린다. 열려도 업그레이드가 진행되지 않는다.

포기하고 자바 웹사이트에서 최신버전을 다운로드해서 설치하려고 했더니 최신버전이 1.8.0 이래. 으응?

 

아아. 다시 찾아보니 firebase-tools 가 불평하는 버전은 JRE 가 아니라 JDK 래. 

최신 버전 JDK를 다시 찾아서 다운로드 한다. (지금은 여기서 받으면 되지만 언제 또 바뀔지 모름. "java se development kit download "로 검색하자.)

 

설치하면 /Library/Java/JavaVirtualMachines 에 jdk-20.jdk 가 생성된다.

이제 firebase 가 실행될 것이다. 정말?

 

2. node.js version

❯ firebase
Firebase CLI v11.27.0 is incompatible with Node.js v14.17.6 Please upgrade Node.js to version ^14.18.0 || >=16.4.0

❯ node
Welcome to Node.js v14.17.6.

 

흑. 이제 노드 버전이 너무 낮아서 또 안된대.

다행히 nvm 을 설치해놓았지.

 

❯ nvm install node
Downloading and installing node v19.9.0...
Downloading https://nodejs.org/dist/v19.9.0/node-v19.9.0-darwin-arm64.tar.xz... ################################################################################################################# 100.0%
Computing checksum with shasum -a 256
Checksums matched!
Now using node v19.9.0 (npm v9.6.3)
❯ node --version
v19.9.0

최신 버전으로 올렸더니 node 19 가 설치되었어. 든든하군.

 

❯ firebase
zsh: command not found: firebase
❯ npm install -g firebase-tools@latest
npm WARN deprecated har-validator@5.1.3: this library is no longer supported
npm WARN deprecated debug@4.1.1: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)
npm WARN deprecated uuid@3.4.0: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.
npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142 added 642 packages in 9s 46 packages are looking for funding run `npm fund` for details

응? 아까까지 있던 firebase 가 없어졌대. ㅠㅠ 

nvm 으로 사용하는 node 버전을 바꾸면 또 다시 설치해줘야해. 최신버전의 firebase-tools 를 다시 설치하자.

 

이렇게 node 19 를 설치했지만, 사실 나중에 다시 16 버전으로 내렸어. 

에뮬레이터 띄우는데 또 뭐가 버전이 안 맞는지 SyntaxError: Unexpected string re"use strict"; 에러가 나왔기 때문이지.

물론 firebase-tools도 다시 설치했지.

 

❯ node --version
v14.17.6

 

3. emulator port 변경

❯ firebase emulators:start --inspect-functions
i emulators: Starting emulators: functions, firestore, hosting
⚠ hosting: Port 5000 is not open on 0.0.0.0, could not start Hosting Emulator.
⚠ hosting: To select a different host/port, specify that host/port in a firebase.json config file:
    {
        // ...
            "emulators": {
                "hosting": { "host": "HOST", "port": "PORT" } } }
i emulators: Shutting down emulators.

아오... 누가 5000번 포트를 쓰고 있어서 안된대. ㅠㅠ 전에는 됐었는데 왜! 누가 쓰고 있는거야?

firebase.json 파일에서 "emulator", "hosting" 아래에 있는 "port" 값을 15000 으로 바꿔줬어

 

4. firebase login

이제 다 된 줄 알았지만, 에뮬레이터가 바로 멈춰버려. 뭔가 잠시 당황했지만, 자세히 보니 firebase login이 안 되어있네.

 

❯ firebase emulators:start --inspect-functions
i emulators: Starting emulators: functions, firestore, hosting
⚠ functions: You are running the Functions emulator in debug mode (port=9229). This means that functions will execute in sequence rather than in parallel.
⚠ functions: The following emulators are not running, calls to these services from the Functions emulator will affect production: auth, database, pubsub, storage
⚠ functions: You are not signed in to the Firebase CLI. If you have authorized this machine using gcloud application-default credentials those may be discovered and used to access production services.
⚠ functions: Unable to fetch project Admin SDK configuration, Admin SDK behavior in Cloud Functions emulator may be incorrect.
i firestore: Firestore Emulator logging to firestore-debug.log
✔ firestore: Firestore Emulator UI websocket is running on 9150.
⚠ hosting: Authentication error when trying to fetch your current web app configuration, have you run firebase login?
⚠ hosting: Could not fetch web app configuration and there is no cached configuration on this machine. Check your internet connection and make sure you are authenticated. To continue, you must call firebase.initializeApp({...}) in your code before using Firebase.
i hosting[....]: Serving hosting files from: public
✔ hosting[....]: Local server: http://0.0.0.0:15000
i ui: Emulator UI logging to ui-debug.log
⚠ ui: Fatal error occurred: Emulator UI has exited with code: 1, stopping all running emulators
i ui: Stopping Emulator UI
⚠ ui: Error stopping Emulator UI
i functions: Stopping Functions Emulator
i hosting: Stopping Hosting Emulator
i firestore: Stopping Firestore Emulator
i eventarc: Stopping Eventarc Emulator
i hub: Stopping emulator hub
i logging: Stopping Logging Emulator

Having trouble? Try firebase [command] --help

그래도 이건 간단하지. 로그인 그까이것 해주면 되는거 아냐.

 

5. localhost

만만치 않군...

에뮬레이터는 떴지만, function이 올라오지 않아.

⬢ functions: Failed to load function definition from source: FetchError: request to http://localhost:8289/__/quitquitquit failed, reason: getaddrinfo ENOTFOUND localhost

응? 설마? 갑자기?

 

/System/Volumes/Data/private/etc/hosts 파일에

 

127.0.0.1 localhost

 

를 추가해줬더니 어흑. 이제야 에뮬레이터가 제대로 떴어...

 

6. request

이제 모든 문제가 해결된 듯 했지만, production 환경에 deploy 할 때 request 패키지에서 문제가 생겼...

또 찾아보니 request 는 이미 과거의 것이 되어있었네. 

간단한 HTTP GET 요청이었으니 

const request = require("request");

request({uri: "https://aaa.com/bbb/ccc",
    headers: {
      testheader: 'asdf'
    },
  }
  , function(error, response, body) {
    const jsonarray = JSON.parse(response.body);
    jsonarray.forEach( async (item) => {
      //......
    });
  });

이것을

 

const https = require('https');

https.get({
      hostname: 'aaa.com',
      path: '/bbb/ccc',
      headers: {
        testheader: 'asdf',
      },
      rejectUnauthorized: false
    }, (response) => {
      let data = [];
      response.on('data', chunk => {
        data.push(chunk);
      });

      response.on('end', () => {
        const jsonarray = JSON.parse(Buffer.concat(data).toString());
        jsonarray.forEach( async (item) => {
            // ......
            });
      });

 

이렇게 바꾸고 request 패키지를 빼버렸음

 

ㅠㅠ 힘들었다.