Firebase functions with Kotlin
ใครที่อยากลองเป็น 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 ให้แล้ว
สิ่งที่ควรมีก่อนเริ่มโปรเจค
- Firebase CLI — อ่านเพิ่ม
- สร้างโปรเจคบน Firebase ก่อน
- Node x Kotlin project
มาเริ่มกันเลย
- เปิดโปรเจคขึ้นมา ไปที่ 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
- เริ่มแก้ไขไฟล์
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 —