Soy nuevo en la función firebase y trato de usar la función firebase con la base de datos en tiempo real (suite del emulador). Pero cuando trato de establecer el valor en firebase usando la función firebase, da un error y no establece el valor en la base de datos.
Error:
17:33:14 I function[us-central1-textToLength] [2021-11-05T12:03:14.194Z] @firebase/database: FIREBASE WARNING: wss:// URL used, but browser isn't known to support websockets. Trying anyway. 17:34:18 I function[us-central1-textToLength] [2021-11-05T12:04:18.762Z] @firebase/database: FIREBASE WARNING: wss:// URL used, but browser isn't known to support websockets. Trying anyway. 17:35:06 I function[us-central1-textToLength] [2021-11-05T12:05:06.473Z] @firebase/database: FIREBASE WARNING: wss:// URL used, but browser isn't known to support websockets. Trying anyway. 17:35:54 I function[us-central1-textToLength] [2021-11-05T12:05:54.409Z] @firebase/database: FIREBASE WARNING: wss:// URL used, but browser isn't known to support websockets. Trying anyway.código de la función firebase:
const functions = require('firebase-functions'); var admin = require("firebase-admin"); admin.initializeApp(); var database = admin.database(); exports.helloWorld = functions.https.onRequest((request, response) => { response.send("Hello from Firebase!"); }); exports.textToLength = functions.https.onRequest((request, response) => { var tex = request.query.text; var textLength = tex.length; console.log(textLength); database.ref().child('test').set("op"); response.send(String(textLength)); });dependencias:
{ "name": "functions", "description": "Cloud Functions for Firebase", "scripts": { "serve": "firebase emulators:start --only functions", "shell": "firebase functions:shell", "start": "npm run shell", "deploy": "firebase deploy --only functions", "logs": "firebase functions:log" }, "engines": { "node": "14" }, "main": "index.js", "dependencies": { "firebase-admin": "^9.8.0", "firebase-functions": "^3.14.1", "@firebase/database-compat": "0.1.2" }, "devDependencies": { "firebase-functions-test": "^0.2.0" }, "private": true }paquetes instalados npm
+-- @firebase/app-compat@0.1.7 | +-- @firebase/app@0.7.6 | | +-- @firebase/component@0.5.8 | | | +-- @firebase/util@1.4.1 deduped | | | `-- tslib@2.3.1 deduped | | +-- @firebase/logger@0.3.1 | | | `-- tslib@2.3.1 deduped | | +-- @firebase/util@1.4.1 | | | `-- tslib@2.3.1 deduped | | `-- tslib@2.3.1 deduped | +-- @firebase/component@0.5.8 | | +-- @firebase/util@1.4.1 deduped | | `-- tslib@2.3.1 deduped | +-- @firebase/logger@0.3.1 | | `-- tslib@2.3.1 deduped | +-- @firebase/util@1.4.1 | | `-- tslib@2.3.1 deduped | `-- tslib@2.3.1 +-- @firebase/database-compat@0.1.2 | +-- @firebase/component@0.5.7 | | +-- @firebase/util@1.4.0 deduped | | `-- tslib@2.3.1 deduped | +-- @firebase/database@0.12.2 | | +-- @firebase/auth-interop-types@0.1.6 | | +-- @firebase/component@0.5.7 deduped | | +-- @firebase/logger@0.3.0 deduped | | +-- @firebase/util@1.4.0 deduped | | +-- faye-websocket@0.11.4 | | | `-- websocket-driver@0.7.4 | | | +-- http-parser-js@0.5.3 | | | +-- safe-buffer@5.2.1 deduped | | | `-- websocket-extensions@0.1.4 | | `-- tslib@2.3.1 deduped | +-- @firebase/database-types@0.9.1 | | +-- @firebase/app-types@0.7.0 | | `-- @firebase/util@1.4.0 deduped | +-- @firebase/logger@0.3.0 | | `-- tslib@2.3.1 deduped | +-- @firebase/util@1.4.0 | | `-- tslib@2.3.1 deduped | `-- tslib@2.3.1 deduped `-- firebase-admin@10.0.0 +-- @firebase/database-compat@0.1.2 deduped +-- @firebase/database-types@0.7.3 | `-- @firebase/app-types@0.6.3 +-- @google-cloud/firestore@4.15.1 | +-- fast-deep-equal@3.1.3 | +-- functional-red-black-tree@1.0.1 | +-- google-gax@2.28.0No estoy seguro de la causa de ese mensaje de registro, pero veo que está devolviendo una respuesta de su función antes de que complete todo su trabajo. En una función implementada, tan pronto como la función regresa, todas las acciones posteriores deben tratarse como si nunca fueran a ejecutarse como se documenta aquí . Una función "inactiva" puede cancelarse en cualquier momento, está severamente limitada y es posible que nunca se ejecuten las llamadas de red que realice (como la configuración de datos en la RTDB).
Sé que eres nuevo en esto, pero es un buen hábito para adoptar ahora: no asumas que la persona que llama a tu función eres tú. Compruebe si hay problemas como parámetros de consulta faltantes y datos dudosos antes de actuar a ciegas. Admin SDK pasa por alto las reglas de seguridad de su base de datos y, si no tiene cuidado, un usuario malintencionado puede causar algún daño (por ejemplo, un usuario que actualiza /users/$theirUid/roles/admin a true ).
exports.textToLength = functions.https.onRequest((request, response) => { const { text: queryText } = request.query; if (!queryText) return response.status(400).send("Missing ?text"); if (typeof queryText !== 'string') return response.status(400).send("Bad value for ?text"); const textLength = queryText.length; database.ref() .child('test') .set("op") .then(() => { console.log(`Successfully updated /test/op to ${textLength}`); response.send(String(textLength)) }) .catch((err) => { console.error(`Failed to update /test/op to ${textLength}: `, error); response.status(500).send(`Failed to update database to ${textLength}`) }); ; });Nota: Al implementar funciones de solicitud HTTPS , no olvide manejar CORS .
Mientras tanto, si tiene la última versión del SDK de administrador, puede anclar @firebase/database-compat a la versión 0.1.2 en su archivo package.json como una solución temporal.
"dependencias": { "@firebase/database-compat": "0.1.2" }
Esto funciona para mí.
Referencia: https://github.com/firebase/firebase-admin-node/issues/1487
Sí, problema definitivamente conocido, actualmente están trabajando en una solución como Kasirajan sugirió https://github.com/firebase/firebase-admin-node/issues/1487#issuecomment-962219551 . Esta solución funcionó para nosotros. Quería votar su comentario, pero mi reputación aún es baja jaja, pero puedo verificar que funciona.
Mientras tanto, si tiene la última versión del SDK de administrador, puede anclar @firebase/database-compat a la versión 0.1.2 en su archivo package.json como una solución temporal.
"dependencies": { "@firebase/database-compat": "0.1.2" }Esto funciona para mí.
Referencia: https://github.com/firebase/firebase-admin-node/issues/1487
Hice referencia a este ejemplo y funcionó, pero para que esto funcione, reconstruya su archivo package-lock.json eliminando la carpeta node_modules y el archivo package_lock.json y ejecutando npm install --package-lock-only