I dette eksempel forbindes der til Firestore via Node.js. Dvs. koden der skal afvikles på serveren kan skrives i javascript, og vi kan derfor bruge viden om syntaks fra arbejdet med p5js.
For at kunne arbejde med firestore fra node.js, skal der laves en pakke / projekt at arbejde i.
Dette kan gøres ved at oprette en mappe til projektet og køre denne kommando for at generere en package.json
fil.
npm init
Man bliver så bedt om at svare på en række spørgsmål, og ender med en struktur der ser nogenlunde sådan ud:
{
"name": "firestore-demo",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
For at kunne benytte Firebase SDK skal vi have dette installeret, hvilket kan klares med kommandoen.
npm install firebase-admin --save
Vi får også brug for at arbejde med formatering af dato og tidspunkter, så derfor vælger vi at bruge biblioteket Moment.js for at lette arbejdet med disse. Moment.js kan installeres med denne kommando.
npm install moment --save
Nu burde Firebase SDK og Moment.js være installeret og tilføjet som afhængigheder og package.json
ser nu nogenlunde således ud.
{
"name": "firestore-demo",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"@google-cloud/firestore": "^3.4.1",
"firebase-admin": "^8.9.1",
"moment": "^2.24.0"
}
}
Som det ses er der nu tilføjet afhængigheder til Firebase og moment pakkerne. De nærmere detaljer kan findes i denne guide.
Dette er et eksempel på en hvordan man kan lave et lille program, der indsætter en stump data i firestore.
// Add the Firebase Admin SDK to Your Server
const firebase = require("firebase-admin");
// Get the helper classes
FieldValue = firebase.firestore.FieldValue;
Timestamp = firebase.firestore.Timestamp;
const moment = require("moment");
// Import crecential for the service account
const serviceAccount = require("./serviceAccountKey.json");
// Initialize the default app
const app = firebase.initializeApp({
credential: firebase.credential.cert(serviceAccount),
databaseURL: "https://coldhawaiiweather.firebaseio.com"
});
const db = firebase.firestore();
// Helper - Generates random integer values
function getRandomInt(max, min) {
const diff = max - min;
return Math.floor(Math.random() * Math.floor(diff) + min);
}
async function storeData() {
// Set time of update
const updateTime = Timestamp.now();
// Generate some fake weather data
const windData = {
time: updateTime,
windSpeed: getRandomInt(15, 3),
windDir: getRandomInt(0, 359),
};
// Document ID should be todays date
const today = moment(updateTime.toDate());
const docPath = `weather/${today.format("YYYY-MM-DD")}`;
const docRef = db.doc(docPath);
const data = {
lastUpdate: updateTime,
windMeasurements: FieldValue.arrayUnion(windData),
};
const options = { merge: true }
await docRef.set(data, options);
}
storeData();
Der skal bruges en såkaldt Service Account, for at kunne forbindes fra node til firebase.
Guiden forklarer, hvad du skal gøre for at oprette en service account til dit firebase projekt.
Disse oplysninger er private, så vær opmærksom på ikke at holde dem for dig selv.
For eksemplet virker skal oplysningerne om din Service Account oprettes i file serviceAccountKey.json
.
For at undgå at sprede disse oplysninger er det en god ide at tilføje denne fil til listen over filer der skal ignoreres af git.
Dvs. at din .gitignore
fil kunne se således ud.
# ignore packages downloaded from npm
node_modules/
# avoid storing firebase login credentials
serviceAccountKey.json
Hvis javascript eksemplet gemmes i en fil med navnet firebase-upload-demo.js
, kan programmet køres med kommandoen
node firebase-upload-demo.js