環境・バージョン
- node version v14.4.0
- "firebase-admin": "^8.7.0"
- "tmp": "^0.2.1"
実装
Firebase Admin SDKの初期化
firebase-admin.js
var admin = require('firebase-admin')
// Retrieve environment variables
const ServiceAccountFilePath = process.env.FIREBASE_SERVICEACCOUNT_FILEPATH
const StorageURL = process.env.FIREBASE_STORAGE_URL // xxxxx.appspot.com
const serviceAccount = require(ServiceAccountFilePath)
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
storageBucket: StorageURL,
})
module.exports = admin
temp fileを使ってアップロード
Firebase Storageに対してファイルをアップロードするために、GCP Node.jsライブラリのBucket.uploadメソッドを利用しました。
一時的ファイル作成と削除にはtmpというサードパッケージを利用しました。
firebase-storage.js
const fs = require('fs')
const tmp = require('tmp')
const admin = require('./firebase-admin') // 上記の初期化コードをインポート
const requestToStorageService = (cloudFilePath, fileContent) => {
var promise
tmp.file(function _tempFileCreated(err, path, fd, cleanupCallback) {
if (err) throw err
try {
const bucket = admin.storage().bucket()
fs.writeFile(path, JSON.stringify(fileContent), err => { // 一時ファイルに書き込み
if (err) throw err
})
promise = bucket.upload(path, { // ファイルをFirebase Storageへアップロード
destination: cloudFilePath,
metadata: { contentType: 'application/json' },
})
} finally {
cleanupCallback() // ファイル削除
}
})
return promise
}
tmp.file(function _tempFileCreated(err, path, fd, cleanupCallback)
によって一時的ファイルのパス(path
)とファイルディスクリプタ(fd
)が渡されます。
そのファイルに書き込みし、Firebase Storageへアップロードします。
また、bucket.upload
はPromiseを返します。