Firebase functions with Kotlin

Ta Theerasan Tonthongkam
ta tonthongkam
Published in
4 min readSep 5, 2018

ใครที่อยากลองเป็น Full-stack Developer, Firebase ถือเป็น Tools ที่น่าจับตามองเลยทีเดียว มันทุกอย่างให้พร้อมแล้วทั้ง Database, Authen, Hosting, Analytic และ Clound functions.

การเขียน App Firebase เราจะต้องฝัง Logic ลงใน Platfrom ต่างๆ ซึ่งไม่ Cool เอาซะเลย — โชคดีที่ Firebase มี functions ที่ทำให้เราสามารถเขียน Service เป็น API ให้ Platfrom ต่างๆ เรียกใช้ แล้วเราคุม Logic ที่ Cloud functions ได้

Firebase functions มาพร้อมกับ JavaScript หรือ TypeScript เป็นค่าเริ่มต้น แต่ว่าเราเป็น Android Developer ไง บางครั้งก็อยากเขียน API เอง แต่ TypeScript และ JavaScript มันขาด Feature ที่คุ้นชินใน Kotlin — งั้นทำไมเราไม่ทำให้ Firebase functions เขียนด้วย Kotlin ได้หล่ะ ในเมื่อมันมี kotlin2js ให้แล้ว

สิ่งที่ควรมีก่อนเริ่มโปรเจค

  1. Firebase CLI — อ่านเพิ่ม
  2. สร้างโปรเจคบน Firebase ก่อน
  3. Node x Kotlin project

มาเริ่มกันเลย

  1. เปิดโปรเจคขึ้นมา ไปที่ Terminal แล้ว init firebase
$ firebase init

จากนั้น Firebase จะถามว่าจะ init อะไรบ้าง ให้เลือก functions

2. เลือกโปรเจคที่เราสร้างไว้ หรือจะสร้างใหม่ก็ได้ ถ้ายังไม่มี Firebase Project

3. เลือกภาษาเป็น JavaScript เพราะเราจะ Compile Kotlin เป็น JS

4. ตั้งค่าอื่นๆ ไปเรื่อยๆ ตาม Command แล้วรอจนเสร็จ เราจะได้ Folder functions อยู่ใน Project เรา

5. ทำให้ functions รู้จัก Kotlin

$ cd functions
$ npm install kotlin --save
$ cd ..

6. แก้ไข build.gradle ให้เปลี่ยน Path ของ output จาก node/index.js ไปที่ functions/index.js

compileKotlin2Js.kotlinOptions {
moduleKind = "commonjs"
outputFile = "functions/index.js"
}

Hello Firebase functions Kotlin

  1. เริ่มแก้ไขไฟล์ index.kt ให้เรียกใช้ functions
external fun require(module:String):dynamic
external val exports: dynamic

fun main(args: Array<String>) {

val functions = require("firebase-functions")
val admin = require("firebase-admin")
admin.initializeApp(functions.config().firebase)

exports.helloFunctions = functions.https.onRequest { req, res ->
val name = req.query.name
res.status(200).send("Hello Functions, welcome $name to the first Kotlin cloud functions")
}
}

2. หลังจากนั้นให้ Build ให้เป็น JS โดยรันคำสั่ง

$ ./gradlew build

หลังจากนั้นเราจะได้ไฟล์ functions/index.js ไฟล์ใหม่ ที่ข้างในจะเป็นโค้ดมั่วๆ

(function (_, Kotlin) {
'use strict';
function main$lambda(req, res) {
var name = req.query.name;
return res.status(200).send('Hello Functions, welcome ' + name + ' to the first Kotlin cloud functions');
}
function main(args) {
var functions = require('firebase-functions');
var admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
exports.helloFunctions = functions.https.onRequest(main$lambda);
}
_.main_kand9s$ = main;
main([]);
Kotlin.defineModule('index', _);
return _;
}(module.exports, require('kotlin')));

3. ติดตั้งเครื่องมือเพื่อรัน Firebase บน Local

$ npm install -g firebase-tools

4. เริ่ม Run cloud functions บน Local

$ firebase serve

ในขั้นตอนนี้ถ้าใครเจอ Error แบบข้างล่างให้ทำ Step 4.1 ต่อ แต่ถ้าไม่ก็ข้ามไปเลยจ้า

Error: An unexpected error has occurred.Having trouble? Try again or contact support with contents of firebase-debug.log

4.1 แก้ error โดยการ init functions อีกรอบ

$ firebase init functions

ในตอนที่มันถามว่า override functions/index.js มั้ย ให้ตอบ No, แต่ถ้าเผลอตอบ Yes ก็รันคำสั่ง $ ./gradlew build ใหม่ได้จ้า แล้วลอง ข้อ 4 ใหม่อีกครั้ง

5. ใน terminal จะบอกว่ามี functions ไหน deploy บน local บ้าง

เราสามารถเข้า ไปที่ http://localhost:5000/ta-bot-8589d/us-central1/helloFunctions?name=ta เพื่อดูผลลัพธ์เพิ่มเติม จะได้ดังภาพ

Deploy functions

เราสามารถ Deploy functions ได้ด้วยคำสั่ง

$ firebase deploy --only functions

เราสามารถเข้าไปดูผลลัพธ์การ Deploy ได้ที่เมนู Function ของ Firebase

จะเห็นว่า Functions deploy แล้ว สามารถเรียก API ได้แล้ว ลองเข้าไปที่ https://us-central1-ta-bot-8589d.cloudfunctions.net/helloFunctions?name=Ta แล้วเราจะเห็นผลลัพธ์เหมือนข้างต้น

ชาว Android ก็สามารถสร้าง API ของตัวเองได้แล้วหล่ะ

ข้อเสีย

จะไม่ขอพูดถึงข้อดีของการใช้ Kotlin แล้วกัน จะขอพูดข้อเสียข้อใหญ่ข้อเดียว — เนื่องจากการรัน Firebase functions ต้องใช้ JS แต่ JS ที่ Compile มา อ่านยากมากกกกกก เวลามีปัญหาหรือ Error เกิดขึ้น มันไม่ได้ชี้มาที่ File Kotlin แต่เป็น File JS — เพราะฉนั้นฝึกวิธี Troble shooting ไว้ก็ดีนะ ไม่งั้นเดี๋ยวแก้บักไม่ได้

สรุป

Firebase Functions เป็น JS component หนึ่งเหมือนกัน ที่สามารถเอา Kotlin มาครอบได้ และสามารถใช้ประโยชน์จากภาษา Kotlin ได้มาก — โดยเฉพาะอย่างยิ่ง เมื่อเราเอา Firebase Functions มาเป็น Backend, Logic มันจะเยอะมาก ใช้ Kotlin เขียนน่าจะตอบโจทย์ และสะดวกกว่าในหลายๆ ด้าน — แต่อาจจะหา StackOverFlow หรือ Document ไม่ได้นาจา ระวังในการใช้ดีๆ ใครลองใช้มีคำถาม หรือไอเดียอะไร มาแลกเปลี่ยนกันได้นะ

refer

Thank you

— end of the story —

--

--