일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 |
- 익스프레스
- 백준js
- 리액트댓글기능
- js코테
- 포이마웹
- 프로그래머스JS
- 알고리즘
- 백준구현문제
- 백준구현
- 백준
- HTML5
- CSS
- 리액트커뮤니티
- css기초
- 리액트
- 백준nodejs
- HTML
- dp알고리즘
- 프로그래머스
- 몽고DB
- JS프로그래머스
- 코딩테스트
- 백준골드
- 자바스크립트
- 백준알고리즘
- 코테
- 안드로이드 스튜디오
- 다이나믹프로그래밍
- JS
- 프로그래머스코테
- Today
- Total
개발새발 로그
firebase admin sdk 초기화(세팅)하기(How to use the firebase-admin.firestore function in firebase-admin) - (nodejs firebase error) 본문
firebase admin sdk 초기화(세팅)하기(How to use the firebase-admin.firestore function in firebase-admin) - (nodejs firebase error)
이즈흐 2023. 9. 5. 01:47
파이어베이스에서 비공개 키를 생성했다면 프로젝트에 연결해보자
firebase_admin.ts
const admin = require('firebase-admin');
interface Config {
credentials: {
privateKey: string;
clientEmail: string;
projectId: string;
};
}
if (!admin.apps.length) {
const config: Config = {
credentials: {
projectId: process.env.projectId || '',
clientEmail: process.env.clientEmail || '',
privateKey: process.env.privateKey?.replace(/\\n/g, '\n') || '',
},
};
admin.initializeApp({
credential: admin.credential.cert(config.credentials),
});
console.info('bootstrap firebase admin');
} else {
admin.app();
}
module.exports = admin;
1. firebase_admin.ts 파일을 생성해서 서버에 firebase admin sdk를 추가한다.
2. firebase_admin.ts에서 아래 코드를 먼저 복사한다.
var admin = require("firebase-admin");
var serviceAccount = require("path/to/serviceAccountKey.json");
admin.initializeApp({
credential: admin.credential.cert(serviceAccount)
});
- 이 코드는 파이어베이스에서 Admin SDK 구성 스니펫에 있는 코드이다.
- 이 코드를 우리가 사용할 방식으로 바꿔보자
3. 먼저 타입스크립트이므로 interface를 만들어준다.
interface Config {
credentials: {
privateKey: string;
clientEmail: string;
projectId: string;
};
}
4. ☝중요
if (!admin.apps.length)
- 해당 if문을 통해서 앱이 실행되어있지 않다면 초기화해주는 것이다.
- 이때 앱이 이미 실행되어서 초기화가 되어있다면 초기화는 하지말고 앱만 실행시키는 부분도 추가했다.
if (!admin.apps.length) {
...
} else {
admin.app();
}
5. if문안에서 비공개키를 생성했던 json 파일을 가져와 준다.
-이때 우리는 .env파일에서 환경변수로 만들어줬으므로 이를 활용한다.
const config: Config = {
credentials: {
projectId: process.env.projectId || '',
clientEmail: process.env.clientEmail || '',
privateKey: process.env.privateKey?.replace(/\\n/g, '\n') || '',
},
};
6. if문 안에서 firebase-admin 모듈을 초기화 해준다.
admin.initializeApp({
credential: admin.credential.cert(config.credentials),
});
7. 중요! 이 모듈을 export해줘서 hello.ts에서 사용이 가능하도록 한다.
module.exports = admin;
이제 파이어베이스가 잘 연결되었는지 확인해보자
hello.ts
import { NextApiRequest, NextApiResponse } from 'next';
const admin = require('../../model/firebase_admin');
export default function handler(_: NextApiRequest, res: NextApiResponse) {
const db = admin.firestore();
db.collection('test');
res.status(200).json({ name: 'hello' });
}
-현재 firestore을 통해서 단지 test 콜렉션을 호출하는 명령어만 사용해 호출과 응답이 잘되는지만 확인했다.
1. 초기화한 모듈을 가져온다.
const admin = require('../../model/firebase_admin');
2. 해당 모듈에서 firestore을 가져온다.
const db = admin.firestore();
3. test라는 이름의 collection을 호출하고, 이후 응답이 잘 오는지 확인한다.
export default function handler(_: NextApiRequest, res: NextApiResponse) {
const db = admin.firestore();
db.collection('test');
res.status(200).json({ name: 'hello' });
}
☝중요한 점
1. firebase admin sdk를 초기화해주고 꼭 모듈을 export 해줘야한다.
module.exports = admin;
2. pribateKey값은 줄바꿈이 \n 로 바뀌어서 한줄로 값을 받아오기 때문에 replace를 통해 그 값을 줄바꿈해줘야한다.
privateKey: process.env.privateKey?.replace(/\\n/g, '\n') || '',
3. 모듈을 가져올 때는 import가 아니고 require을 이용한다.
const admin = require('../../model/firebase_admin');
참고 사이트
https://snyk.io/advisor/npm-package/firebase-admin/functions/firebase-admin.firestore
💢오류
error - Error: The default Firebase app already exists.
This means you called initializeApp() more than once without providing an app name as the sec to give each app a unique name.
-nodejs에서 firebase를 이용해 푸쉬메시지를 발송할 때 발생하는 에러입니다.
-위 에러 메시지를 보면 initializeApp()이 여러번 호출되여 발생하는 에러입니다.
const admin = require("firebase-admin");
const serviceAccount = require("../config/serviceAccount.json");
const databaseURL = "databaseURL";
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: databaseURL,
});
nodejs 코드내에서 2번 호출되는 부분이 생겨 문제가 발생합니다.
2. 해결 방법
const admin = require("firebase-admin");
const serviceAccount = require("../config/serviceAccount.json");
const databaseURL = "databaseURL";
if (!admin.apps.length) {
var firebaseAdmin = admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: databaseURL,
});
}
- 위의 코드처럼 있을시에는 저 로직을 안타게끔 설정해주시면 정상적으로 해결이 됩니다.
추가 수정 부분
https://coding-honeyjam.tistory.com/26