Firestore Node Upload

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.

Opsætning af Node projekt

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.

Firestore upload eksempel

// 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.

Håndtering af private nøgler

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

Materiale