Как установить пакетное удаление при создании нового документа (с помощью триггеров) - PullRequest
1 голос
/ 24 июня 2019

Я делаю проект URL shortner (новый для firebase), использую firestore с коллекцией ref url/{newDocs} для каждой новой схемы документа следующим образом:

let schema = {
  code: codeGeneratedbyShortidPackage,
  url: req.body.URL,
  expiredAt: Date.now()+60000  // in milisceonds i.e 10 mins for 600000
}

Мой вопрос - как установитьпакетное удаление для каждого документа, который превысил свое временное ограничение, присутствующее в каждом документе, после добавления нового документа по указанной выше ссылке в firestore.

Я пробовал следующий код, но он не работал.


exports.deleteFunc = functions.firestore.document('url/{docId}').onCreate( ( change, context) => {
   
   let newbatch = db.batch() ;
   db.collection('nonauth_url').where( 'expiredAt' , '<=', Date.now()).get().then( (snapshot) => {
  snapshot.forEach( (doc) => {
     newbatch.delete(doc.ref) ;
  }) ;
   }).then( () => {
  console.log('Delete done') ;
   }) ;
   return newbatch.commit().then( () => {
  console.log('Batch Committed');
   }).catch( (err) => {
  console.error('error occurred', err) ;
   }) ;
}) ;

Ответы [ 2 ]

0 голосов
/ 26 июня 2019

вот мои index.js и index.html проекта

<h1>URL Shortner !!</h1>
    <hr>
    <form method="POST" action="/parse-url">
      <input type="url" name="url" id="url"><br>
      <button type="submit" id="submit">Submit</button>
    </form>
    <h1 id="newurl"></h1>

const functions = require('firebase-functions');
const admin = require('firebase-admin') ;
const express = require('express') ;
const urlId = require('shortid') ;

const sp = require('synchronized-promise') ;

const serviceAccount = require('./url-shortner-2596201e2cac.json') ;

const app = express() ;

admin.initializeApp({
   credential: admin.credential.cert(serviceAccount)
});

let db = admin.firestore() ;
let Data = db.collection('nonauth_url') ;

app.post('/parse-url', (req, res) => {

   let codeGenerated = urlId.generate() ;

   let docname = 'url_doc-' + codeGenerated ;

   let schema = {
      code: codeGenerated,
      url: req.body.URL,
      expiredAt: Date.now()+600000  // in milisceonds
   }

   let database = Data.doc(docname).set(schema) ;
   res.send(schema.code) ;
}) ;

const getDatasPromise = () => {
   return new Promise((resolve, reject) => {
       let events = [];
       const dataRetrieve = Data.get()
           .then((snapshot) => {
               snapshot.forEach((doc) => events.push(doc.data()));
               resolve(events); // return the events only after they are fetched
           })
           .catch(error => {
               reject(error);
           });
   });
};

app.get('/:code', (req, res) =>{
   let url_code = req.params.code ;
   let target_url ;
   if( urlId.isValid(url_code) ){
      
      let syncFunc = sp(getDatasPromise) ;
      let dataArr = syncFunc() ;

      dataArr.forEach( (doc) => {
         if( doc.code === url_code && ( doc.expiredAt > Date.now() ) ){
            target_url = doc.url ;
         }
      }) ;
      if( target_url !== undefined){
         res.redirect(target_url) ;
      }
      else{
         console.log('url not found') ;
         res.status(404).redirect('404.html') ;
      }
   }
   else{
      res.status(404).redirect('404.html') ;
   }
}) ;

// Create and Deploy Your First Cloud Functions
// https://firebase.google.com/docs/functions/write-firebase-functions

exports.routeFunc = functions.https.onRequest(app) ;

exports.deleteFunc = functions.firestore.document('/nonauth_url/{docId}').onCreate( ( change, context) => {
   
   let database = admin.firestore() ;
   let newbatch = database.batch() ;

   return database.collection('nonauth_url').where('expiredAt', '<=', Date.now())
      .get()
      .then( (snapshot) => {
         snapshot.forEach( doc => {
            newbatch.delete(doc.ref) ;
         }) ;
         return newbatch.commit() ;
      })
      .catch( (err) => {
         console.error('error occurred', err) ;
      }) ;
}) ;

проблема возникает в deleteFunc

0 голосов
/ 24 июня 2019

Следующий код должен помочь:

exports.deleteFunc = functions.firestore
  .document('url/{docId}')
  .onCreate((change, context) => {
    const db = admin.firestore();
    let newbatch = db.batch();

    return db
      .collection('nonauth_url')
      .where('expiredAt', '<=', Date.now())
      .get()
      .then(snapshot => {
        snapshot.forEach(doc => {
          newbatch.delete(doc.ref);
        });

        return newbatch.commit();
      })
      .catch(err => {
        console.error('error occurred', err);
      });
  });

Обратите внимание, что вы ДОЛЖНЫ вернуть Promise или значение в фоновой облачной функции.Я бы посоветовал вам посмотреть 3 видео о «Обещаниях JavaScript» из серии видеороликов Firebase: https://firebase.google.com/docs/functions/video-series/, которые объясняют этот ключевой момент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...