Firebase: Cloud Function ครั้งแรก

Cloud function คือ function ที่อยู่บน cloud ยังไงล่ะ ~~ เราสามารถเรียก function พวกนี้ได้ผ่าน Trigger ส่วน แต่ละ Trigger ก็จะทำงานไม่เหมือนกันนะ เช่น Authentication Trigger ก็จะทำงานเมื่อเกิดการ Authentication ส่วน Real time database Trigger ก็จะถูกเรียกเมื่อมีการทำงานจาก database[firebase]
แต่วันนี้ได้โจทย์มาเป็น เมื่อ New Message เก็บลง Database ให้เขียน logs เพิ่มไปด้วย โดยให้เอาข้อความเดียวกันไปแปะไว้เป็น data โดยใช้ Trigger ใน Cloud Function มาเริ่มกันเลยดีก่า
ลงนี่ก่อน :D
$ npm install -g firebase-admin firebase-tools
$ firebase login
$ firebase init functionsStructure
- functions
- index.js
- server.jsส่วนตัว server.js เป็นแค่ web server เฉยๆนะ
const firebase = require('firebase-admin')
const config = require('./config/firebaseConfig')
const express = require('express')
const bodyParser = require('body-parser')const PORT = '3000'
const app = express()
const router = express.Router()app.use(bodyParser.json())
firebase.initializeApp(config)
var database = firebase.database()router
.get('/messages', async function(req,res){
const messages = await database.ref('/messages').once('value')
const response = Object.assign({}, messages.val())
res.send(response)
})
.post('/messages', function(req,res){
var request = req.body
var message = {
"text": req.body.text,
"user": {
"id": req.body.user.id,
"name": req.body.user.name
},
"created_at": new Date().toString()
} database.ref('/messages').push(message)
res.send(message)
})router
.get('/logs', async function(req,res){
const messages = await database.ref('/logs').once('value')
const response = Object.assign({}, messages.val())
res.send(response)
})app.use('/', router)
app.listen(PORT, function(){
console.log(`Server running at port ${PORT}`)
})
GET /messages กับ /logs ก็แค่เอาไว้ดึง Messages กับ Logs จาก Database นะ
POST /messages เป็น api ไว้ยิงข้อมูลไป New Message
สาระ : database.ref([table]) : คือการอ้างอิงถึงตารางนั้น [ขอเปรียบมันเป็นตาราง]
สาระ 2: ส่วน .push คือการต่อสิ่งที่เราต้องการจะเพิ่มเข้าไปในส่วนท้าย
สาระ 3: จริงๆ firebase มันมี set ด้วย ความแตกต่างระหว่าง set กับ push คือ
push จะ gen key ที่เป็น unique key มาให้ เช่น -KsNV9-JTZYpS_ea7g1P
set เราสามารถตั้ง key เองได้
Express, Object assign, Async Await ไปศึกษาเอาเองนะ 555
ใน functions/index.js จะเอาไว้เก็บ cloud function นะ
ข้างในจะประกอบไปด้วย
const firebase = require('firebase-admin')
const functions = require('firebase-functions')firebase.initializeApp(functions.config().firebase)exports.newMessage = functions.database.ref('/messages/{messageId}')
.onWrite(event => {
const raw = event.data.val()
firebase.database().ref('logs').push(raw)
})
จะเห็นได้ว่า functions มัน ref ไปถึง database ได้ด้วยแหละ (จริงๆมันมีอีกหลายอันนะ วันนี้เอาแค่ database ก่อน) ที่ Path ‘/message/{messageId}’ หมายถึง path ที่โดน ref ถึงใน database เกิดซัมติงขึ้น ฟังชั่นนี้จะถูกเรียก
เมื่อไหร่ล่ะ
มันจะมี .onWrite | .onCreate | .onUpdate | .onDelete ซึ่ง event มันก็ตรงตัวอยู่แล้วเนอะ
ในที่นี้จะใช้ .onWrite มา handle trigger นะฮ่ะ
สิ่งที่เราจะได้คือ event และสิ่งที่เรียกว่า DeltaSnapshot หรือข้อมูลที่เราเพิ่งจะทำอะไรกับมันเมื่อกี้นี่แหละ
เขียนเสร็จแล้ว Deploy !!!
$ firebase deploy --only functionsใน firebase console ในช่อง functions ก็จะมีของใหม่โผล่ขึ้นมา

ลอง New Message ดู


แค่นี้แหละ 555 จริงๆได้ลองเล่น FCM (Firebase Cloud Messaging) ดูนิดๆนะ พอจะเข้าใจ concept ละ แต่ไม่ได้เขียนแอพไง ลองยิงเล่นไม่ได้ T_T
ขอบคุณที่อ่านมาจนจบ 5555
ref :
https://firebase.google.com/docs/functions/database-events
https://firebase.google.com/docs/reference/functions/functions.database.DeltaSnapshot
