今天在進入Push Notification
推播功能之前,
我們觸發雲端資料是,讀取Firebase
上的資料庫連結,
但這樣資料庫一變動,就要再改url
有點麻煩,
因此今天改用Firebase
上的Function
來實作,POST
文章的方式。
npm install -g firebase-tools
安裝完Firebase tool
後
firebase init
這裡選擇我們專案會使用到的功能Functions
和Hosting
後,點選「Enter」
專案選,我們練習的專案
這裡注意不要複寫我們前面練習用的index.html
後,就初始化成功了!
cd functions/
在初始化後,會發現資料夾中多了functions
的資料夾、.firebaserc
和404.html
等檔案
下一步,移動functions
資料夾
npm install firebase-admin cors --save
安裝 firebase-admin
和cors
套件,解決傳輸資料到資料庫上時,需要授權的問題。
打開functions/index.js
檔案
// exports.helloWorld = functions.https.onRequest((request, response) => {
// response.send("Hello from Firebase!");
// });
會看到function
的預設寫法(template
),接著我們稍微修改一下內容。
var admin = require('firebase-admin');
var cors = require('cors')({orgin: true});
exports.storePostData = functions.https.onRequest(function(request, response) {
cors(request, response, function(){
admin.database().ref('article').push({
id: request.body.id,
title: request.body.title,
location: request.body.location,
image: request.body.image,
content: request.body.content
})
.then(function(){
response.status(201).json({message: '資料送出', id: request.body.id});
})
.catch(function(err) {
response.status(500).json({error: err});
});
});
})
storePostData
是Function
的變數名稱可自行命名,admin.database().ref('article')
找到article
的資料表,並使用push
丟json
格式資料到firebase
上,request.body.變數名稱
將畫面上輸入的值塞入變數中。
如果成功回應HTTP 201
,失敗回應HTTP 500
var serviceAccount = require("./pwa-firebase-pk.json");
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: 'https://days-pwas-practice.firebaseio.com/'
});
databaseURL
可以從Database
上方找到。
cert
需要私密金鑰(Private Key
)的json
檔案
點選Firebase
上的齒輪,「專案設定」
點選「產生新的私密金鑰」,即可下載檔案,放入functions/
資料夾底下,接著全線的部分就處理完了。
firebase deploy
在Function URL
後面有一串,我們寫的功能的連結,將連結複製起來,要用來取代專案中原本Fetch
資料庫的網址。
發佈成功後,在Firebase/Function
上,就看的到我們寫的功能。
修改Service Worker
中,sync
監聽事件裡面fetch
事件的url
self.addEventListener('sync', function(event){
if(event.tag === 'sync-new-post') {
event.waitUntil(
readAllData('sync-posts')
.then(function(data){
for(var post of data)
{
fetch('https://us-central1-days-pwas-practice.cloudfunctions.net/storePostData',{...})
})
.then(function (res) {
...
})
.catch(function(err){
...
});
}
})
);
}
});
修改post.js
中,POST
文章用的fetch
功能的連結(URL
)
var articleUrl = 'https://us-central1-days-pwas-practice.cloudfunctions.net/storePostData';
填表單。
送出表單後,從console
視窗,會看到成功將資料POST
到Firebase
上的訊息,還有我們設定的status: 201
。
接著重整網頁就會看到我們原本預期的結果囉!!