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

Pozterz
Pozterz
Aug 25, 2017 · 3 min read

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 functions

Structure

- 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 ดู

* ข้อมูลสมมุติขึ้นมานะจ้ะ 5555

แค่นี้แหละ 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

)

Pozterz

Written by

Pozterz

Lv.25 Full Stack Pokemon @Pi R Square

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade