Почему локальная функция удаления документов Firebase не работает, пока обслуживаемая версия работает? - PullRequest
0 голосов
/ 02 июля 2019

У меня бэкэнд Firebase Node.js, развернутый и работающий локально с использованием> firebase serve (который я использую для предварительной разработки).Я могу добавлять и обновлять документы локально (используя Postman для эмуляции внешнего REST API).То же самое относится и к моему серверу Firebase.Что не работает, так это мои процедуры удаления документов при локальном запуске.Они отлично работают при запуске с версией сервера в Google.(Обратите внимание. Процедуры удаления работали локально, когда я работал с более ранней версией 8.x Node.

Вот мой package.json

{
  "name": "functions",
  "description": "Cloud Functions for Firebase",
  "scripts": {
    "lint": "eslint .",
    "serve": "firebase serve --only functions",
    "shell": "firebase functions:shell",
    "start": "npm run shell",
    "deploy": "firebase deploy --only functions",
    "logs": "firebase functions:log"
  },
  "engines": {
    "node": "10"
  },
  "dependencies": {
    "actions-on-google": "^2.7.0",
    "firebase-admin": "^8.0.0",
    "firebase-client": "0.1.1",
    "firebase-functions": "^3.0.2",
    "moment": "^2.24.0",
    "request-promise-native": "^1.0.7",
    "sprintf-js": "^1.1.2",
    "twilio": "^3.32.0"
  },
  "devDependencies": {
    "eslint": "^5.12.0",
    "eslint-plugin-promise": "^4.0.1",
    "firebase-functions-test": "^0.1.6"
  },
  "private": true
}

Мой локальный env - Windows 7.Я использую Postman для вызова локальных и обслуживаемых версий, и журналы для обоих одинаковы, без ошибок.

Моя локальная версия Node v10.16.0

Наконец-то вот мой вариант удаленияпроцедуры.

'use strict'
const functions = require('firebase-functions')
var firebaseClient = require('firebase-client')
var moment = require('moment');

const serviceAccount = require("./myconfiguration Info");
const admin = require('firebase-admin');
admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "my db url"
});
var db = admin.firestore()
db.settings({ timestampsInSnapshots: true })
var sessionRef = db.collection('Sessions')

exports.clearSessions = async function(){
  const response = await sessionRef.get().then(snapshot=>{
    snapshot.forEach((doc=>{
      if (doc.exists){
        doc.ref.delete()
      }
    }))
    return true
  }).catch(err=>{
    console.error(err)
    console.log('return false')
    return false
  })
  console.log(response)
  return response
}

1 Ответ

1 голос
/ 03 июля 2019

Я не уверен, что это проблема, но вы игнорируете обещания, возвращенные с delete().clearSessions вернется до разрешения.Из того, кто код вызывает clearSessions или что происходит после этого, не ясно, но если ваша программа завершает работу после ее завершения, работа может не завершиться.Если вы намереваетесь вызвать это из облачной функции, работа почти наверняка не будет завершена до завершения функции, если обещания не принимаются во внимание.

Кроме того, вы используете слегка устаревшую версию firebase-админ.Попробуйте обновить его.

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