2 votes

Les triggers de la base de données Firebase et l'API Rest dans le même projet ?

J'ai un projet de fonction cloud Firebase dont j'ai récemment mis à jour toutes les fonctions.https.onRequest pour les exécuter via Express afin de créer un service API REST. Les API fonctionnent bien. Mais lorsque j'essaie de déployer le projet, aucun des anciens triggers de la base de données Firebase n'est plus déployé (Exemple : Le déclencheur CalculateMyStats fonctionnait bien, mais a été supprimé de ma liste de fonctions cloud). Seule la fonction restante est déployée maintenant. Est-il possible d'avoir des API Rest et des déclencheurs dans le même projet ?

index.ts

import * as admin from 'firebase-admin';
import * as functions from 'firebase-functions';
import * as http from './http';

import { AddLocationIOBookMarks, DistrubuteNotificationData, NewUserEmail } from './users/usersFuncModules';

import { AutoCheckoutCron } from './locations/locationsFuncModule';
import { CalculateMyStats } from './rating/ratingFuncModule';
import { FIREBASE_CONFIG } from './config/firebaseConfig';
import { LocationsUserCount } from './pushNotifications/pushFuncModule';

export { AddLocationIOBookMarks, DistrubuteNotificationData, NewUserEmail };

export { AutoCheckoutCron };

export { CalculateMyStats };
export { LocationsUserCount };

admin.initializeApp({
  credential: admin.credential.cert({
    projectId: FIREBASE_CONFIG.project_id,
    clientEmail: FIREBASE_CONFIG.client_email,
    privateKey: FIREBASE_CONFIG.private_key
  }),
  databaseURL: FIREBASE_CONFIG.databaseURL
});

admin.firestore().settings({ timestampsInSnapshots: true });

exports.rest = functions.https.onRequest(http.endpoint);

ratingFuncModule.ts

import * as express from 'express';
import * as functions from 'firebase-functions';
import * as http from '../http';
import * as myStatsModule from './calculateMystats';
import * as ratingModule from './rateUser';

import { fsConst } from '../firestoreConst';

const rateRoute = express.Router();
const cors = require('cors');
const corsOptions = http.corsOptions;

export const CalculateMyStats = functions.firestore.document(`${fsConst.USERRATINGS}/{doc-id}`).onWrite((change, context) => {
  const ratedUser = change.after.data();
  return myStatsModule.roundAllMyStats(ratedUser.userId).catch(error => {
    console.error(new Error(error), `| Method: CalculateMyStats`);
  });
});

rateRoute.get('/rate/updateRating', cors(corsOptions), (req, res) => {
  const currentUserId = req.query.currentUserId;
  const toBeRatedUserId = req.query.toBeRatedUserId;
  const rateDocId = req.query.rateDocId;
  const rateFormValues = req.query.rateFormValues;

  ratingModule
    .rateCurrentUser(currentUserId, toBeRatedUserId, rateDocId, rateFormValues)
    .then(data => {
      if (rateDocId !== 'undefined') {
        res.send(JSON.stringify(rateDocId));
      } else {

        res.send(JSON.stringify(data));
      }
    })
    .catch(error => {
      console.error(new Error(error), `| Method: updateUserRating`);
    });
});

// Export all routes for rating related http request
module.exports = rateRoute;

firebase.json

{
  "functions": {
    "predeploy": [
      "npm --prefix $RESOURCE_DIR run lint",
      "npm --prefix $RESOURCE_DIR run build"
    ],
    "source": "functions"
  },
  "hosting": {
    "public": "public",
    "rewrites": [{
      "source": "/api/v1/**",
      "function": "rest"
    }],
    "ignore": ["firebase.json", "**/.*", "**/node_modules/**"]
  }
}

Et quand je me déploie :

firebase deploy --only functions

0voto

mdakovac Points 175

Vous devez exporter toutes vos fonctions de déclenchement en même temps que votre exports.rest en index.ts comme suit :

import { CalculateMyStats } from './rating/ratingFuncModule';

exports.rest = functions.https.onRequest(http.endpoint); // your existing export
exports.calculateMyStats = CalculateMyStats // trigger function export

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X