如果使用 google 手冊上 sample 的寫法,會發現到這坨 functions 都是寫在 index.js 裡面,真的很難維護。

起因

在開發 cloud function 的時候,通常都會先參考官方的手冊,但是官方的手冊絕大部分都是 sample,有時候很不好套用在真實的開發環境上。像是 google 手冊上 sample 的寫法,是將所有的 functions 寫進 index.js 裡面,但是這在多人開發的時候就會冒出問題了,總不能等夥伴開發完了之後,再換你開發;又或者大家一起進入到 git 的 merge 地獄。

解決方式

index.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
'use strict';

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

const glob = require("glob");
const files = glob.sync('./**/*.function.js', { cwd: __dirname });
const fileLength = files.length;

// initialize app
admin.initializeApp(functions.config().firebase);

for (let f = 0; f < fileLength; f ++) {
const file = files[f];
const functionName = file.split('/').pop().slice(0, -12); // Strip off '.function.js'

if (!process.env.FUNCTION_NAME || process.env.FUNCTION_NAME === functionName) {
exports[functionName] = require(file);
}
}

file structure

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
├── index.js
├── package-lock.json
├── package.json
└── src
├── database
│   ├── dmError-write
│   │   └── deleteMessagesAndSecretWhenDmError.function.js
│   ├── messages-update
│   │   └── sendPwdToSenderViaDm.function.js
│   ├── messsges-write
│   │   └── sendMessageToTwitter.function.js
│   ├── senders-write
│   │   ├── deleteTweet.function.js
│   │   └── writeMessagesToDatabase.function.js
│   └── tweetError-write
│   └── deleteMessagesAndSecretWhenTweetError.function.js
└── pubsub
└── twitterDmReceived.function.js

這樣子就可以把這些 functions 依照你喜愛的存放方式存放了。