I have defined the following function in my index.ts file:
export const stripeCharge = functions.region('europe-west1').database
.ref('/payments/{userId}/{paymentId}')
.onWrite(async (change, context) => {
...
});
I want to debug this function, so I am trying to use the Google Cloud Functions Emulator (npm install -g #google-cloud/functions-emulator).
First i run:
functions start
to start the emulator.
Then I want to deploy the function:
functions deploy --trigger-http --timeout 600s stripeCharge
This results in the following errors:
ERROR: Function load error: Code could not be loaded.
ERROR: Does the file exists? Is there a syntax error in your code?
ERROR: Detailed stack trace: Warning, FIREBASE_CONFIG and GCLOUD_PROJECT environment variables are missing. Initializing firebase-admin will fail
C:\Users\Jesper\intergun\functions\lib\index.js:14
const stripe = new Stripe(functions.config().stripe.testkey);
^
TypeError: Cannot read property 'testkey' of undefined
at Object.<anonymous> (C:\Users\Jesper\intergun\functions\lib\index.js:14:52)
at Module._compile (module.js:653:30)
at Object.Module._extensions..js (module.js:664:10)
at Module.load (module.js:566:32)
at tryModuleLoad (module.js:506:12)
at Function.Module._load (module.js:498:3)
at Module.require (module.js:597:17)
at require (internal/module.js:11:18)
at [eval]:1:40
at ContextifyScript.Script.runInThisContext (vm.js:50:33)
ERROR: Error: Failed to deploy function.
at exec (C:\Users\Jesper\AppData\Roaming\nvm\v8.16.0\node_modules\#google-cloud\functions-emulator\src\cli\controller.js:126:22)
at ChildProcess.exithandler (child_process.js:288:5)
at emitTwo (events.js:126:13)
at ChildProcess.emit (events.js:214:7)
at maybeClose (internal/child_process.js:915:16)
at Process.ChildProcess._handle.onexit (internal/child_process.js:209:5)
So i think the problem is that it cannot find FIREBASE_CONFIG and GCLOUD_PROJECT, which I don't understand since they should be automatically populated according to this: https://firebase.google.com/docs/functions/config-env
This is at the top of my index.ts file:
import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
import 'firebase-functions';
import * as Stripe from 'stripe';
admin.initializeApp();
const stripe = new Stripe(functions.config().stripe.testkey);
I also have a .runtimeconfig.json file which contains the following:
{
"stripe": {
"testkey": "..."
}
}
Finally, here is my package.json:
{
"name": "functions",
"scripts": {
"lint": "tslint --project tsconfig.json",
"build": "tsc",
"serve": "npm run build && firebase serve --only functions",
"shell": "npm run build && firebase functions:shell",
"start": "npm run shell",
"deploy": "firebase deploy --only functions",
"logs": "firebase functions:log"
},
"engines": {
"node": "8"
},
"main": "lib/index.js",
"dependencies": {
"#google-cloud/storage": "^2.5.0",
"firebase-admin": "^8.1.0",
"firebase-functions": "^3.0.1",
"stripe": "^7.1.0"
},
"devDependencies": {
"#types/sharp": "^0.22.2",
"#types/stripe": "^6.30.0",
"firebase-functions-test": "^0.1.6",
"tslint": "^5.12.0",
"typescript": "^3.2.2"
},
"private": true
}
How can I fix this?
You use the emulators provided by the Firebase CLI in order to test functions written using the Firebase SDKs. The Cloud emulator (#google-cloud/functions-emulator) will not work.
Unfortunately, you're writing a Realtime Database function, which is currently not supported by the emulator.
Related
When installing packages for Firebase Cloud Functions, I get the error:
404 Not Found - GET https://registry.npmjs.org/database-debug.log - Not found
When checking the above URL I indeed see:
{"error":"Not found"}
I am using NodeJS version 14.20.1, npm version 9.1.3 and firebase-tools version 11.16.1.
The following is my package.json file:
{
"name": "functions",
"type": "module",
"scripts": {
"build": "tsc",
"emulators:start": "firebase emulators:start",
"emulators:stop": "lsof -t -i:5000 -i:5001 -i:4030 -i:9099 -i:9001 -i:9199 -i:8091 -i:9090 | xargs kill -9",
"serve": "npm run build && firebase emulators:start --only functions",
"shell": "npm run build && firebase functions:shell",
"start": "npm run shell",
"test": "mocha --reporter spec --timeout 10000",
"deploy": "firebase deploy --only functions",
"logs": "firebase functions:log"
},
"engines": {
"node": "14"
},
"main": "lib/index.js",
"dependencies": {
"#babel/core": "^7.20.5",
"#babel/preset-env": "^7.20.2",
"#babel/runtime": "^7.20.6",
"#firebase/app-compat": "^0.1.28",
"#google-cloud/tasks": "^3.0.5",
"#types/rimraf": "^3.0.2",
"acorn": "^8.8.1",
"axios": "^0.27.2",
"chai": "^4.3.4",
"csv-parse": "^5.2.1",
"firebase-admin": "^11.3.0",
"firebase-functions": "^4.1.0",
"fs": "0.0.1-security",
"mocha": "^9.1.3",
"puppeteer": "^10.4.0",
"rimraf": "^3.0.2",
"typescript": "4.3.5",
"typesense": "^1.3.0"
},
"devDependencies": {
"firebase-functions-test": "^0.3.3"
},
"private": true
}
The end of the log says:
2781 verbose stack HttpErrorGeneral: 404 Not Found - GET https://registry.npmjs.org/database-debug.log - Not found
2781 verbose stack at /home/wpghijsen/.nvm/versions/node/v14.20.1/lib/node_modules/npm/node_modules/npm-registry-fetch/lib/check-response.js:95:15
2781 verbose stack at processTicksAndRejections (internal/process/task_queues.js:95:5)
2781 verbose stack at async RegistryFetcher.packument (/home/wpghijsen/.nvm/versions/node/v14.20.1/lib/node_modules/npm/node_modules/pacote/lib/registry.js:85:19)
2781 verbose stack at async RegistryFetcher.manifest (/home/wpghijsen/.nvm/versions/node/v14.20.1/lib/node_modules/npm/node_modules/pacote/lib/registry.js:116:23)
2781 verbose stack at async Arborist.[nodeFromEdge] (/home/wpghijsen/.nvm/versions/node/v14.20.1/lib/node_modules/npm/node_modules/#npmcli/arborist/lib/arborist/build-ideal-tree.js:1056:19)
2781 verbose stack at async Arborist.[buildDepStep] (/home/wpghijsen/.nvm/versions/node/v14.20.1/lib/node_modules/npm/node_modules/#npmcli/arborist/lib/arborist/build-ideal-tree.js:926:11)
2781 verbose stack at async Arborist.buildIdealTree (/home/wpghijsen/.nvm/versions/node/v14.20.1/lib/node_modules/npm/node_modules/#npmcli/arborist/lib/arborist/build-ideal-tree.js:206:7)
I checked https://status.npmjs.org , as per npm ERR! 404 Not Found - GET https://registry.npmjs.org/error-ex , but it shows no incidents.
It occurs to me that maybe I need a different node version, but any other suggestions would be helpful.
Answering as community wiki.
This was mentioned here in this github thread.This is a bug in lib/outdated.js – it shouldn't be treating npm-debug.log as a package to be updated. This error will go away if you remove npm-debug.log manually from node_modules
I have an exception when deploying a Firebase function. Has anyone run into this weird error? I am confused by the error message.
If so, what is the solution?
I am using the below command
firebase deploy --only functions:chapterpptx
i deploying functions
i functions: ensuring required API cloudfunctions.googleapis.com is enabled...
i functions: ensuring required API cloudbuild.googleapis.com is enabled...
i functions: ensuring required API artifactregistry.googleapis.com is enabled...
✔ functions: required API artifactregistry.googleapis.com is enabled
✔ functions: required API cloudfunctions.googleapis.com is enabled
✔ functions: required API cloudbuild.googleapis.com is enabled
Error: Error occurred while parsing your function triggers.
/Users/xxxxxx/Projects/nationals/functions/node_modules/firebase-admin/lib/app/firebase-app.js:174
this.appStore?.removeApp(this.name);
^
SyntaxError: Unexpected token '.'
at wrapSafe (internal/modules/cjs/loader.js:1052:16)
at Module._compile (internal/modules/cjs/loader.js:1100:27)
at Module._compile (pkg/prelude/bootstrap.js:1394:32)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1156:10)
at Module.load (internal/modules/cjs/loader.js:984:32)
at Function.Module._load (internal/modules/cjs/loader.js:877:14)
at Module.require (internal/modules/cjs/loader.js:1024:19)
at Module.require (pkg/prelude/bootstrap.js:1338:31)
at require (internal/modules/cjs/helpers.js:72:18)
Here is my package.json for the Firebase functions folder
{
"name": "functions",
"description": "Cloud Functions for Firebase",
"scripts": {
"serve": "firebase serve --only functions",
"shell": "firebase functions:shell",
"start": "npm run shell",
"deploy": "firebase deploy --only functions",
"logs": "firebase functions:log"
},
"engines": {
"node": "16"
},
"dependencies": {
"axios": "^1.1.3",
"cors": "^2.8.5",
"firebase": "^9.12.1",
"firebase-admin": "^11.2.0",
"firebase-functions": "^4.0.1",
"xml-js": "^1.6.11"
},
"devDependencies": {
"firebase-functions-test": "^0.1.6"
},
"private": true
}
I already have a firebase functions project setup in some folder in my computer but was trying to set it up somewhere else. When doing that, it happens to mess up something somewhere and i now get that error when deploying my functions using firebase deploy :
functions# build C:\Users\bertr\Documents\GitHub\GreenplayFirebaseFunctions\functions
> tsc
+ functions: Finished running predeploy script.
i functions: ensuring required API cloudfunctions.googleapis.com is enabled...
i functions: ensuring required API cloudbuild.googleapis.com is enabled...
+ functions: required API cloudbuild.googleapis.com is enabled
+ functions: required API cloudfunctions.googleapis.com is enabled
Error: Error occurred while parsing your function triggers.
TypeError: Cannot read property 'SDK_VERSION' of undefined
at registerDatabase (C:\Users\bertr\Documents\GitHub\GreenplayFirebaseFunctions\functions\node_modules\#firebase\database\dist\index.node.cjs.js:15610:28)
at Object.<anonymous> (C:\Users\bertr\Documents\GitHub\GreenplayFirebaseFunctions\functions\node_modules\#firebase\database\dist\index.node.cjs.js:15645:5)
at Module._compile (internal/modules/cjs/loader.js:1072:14)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1101:10)
at Module.load (internal/modules/cjs/loader.js:937:32)
at Function.Module._load (internal/modules/cjs/loader.js:778:12)
at Module.require (internal/modules/cjs/loader.js:961:19)
at require (internal/modules/cjs/helpers.js:92:18)
at FirebaseNamespace.get (C:\Users\bertr\Documents\GitHub\GreenplayFirebaseFunctions\functions\node_modules\firebase-admin\lib\firebase-namespace.js:259:38)
at Object.<anonymous> (C:\Users\bertr\Documents\GitHub\GreenplayFirebaseFunctions\functions\lib\firebase\firebase.js:13:20)
Tried to upgrade firebase-tools, reinstalling firebase, setup account again but i still get that error. Maybe that has a link to firebase SDK V8 and 9 but i'm not sure... I did'nt change anything in my code.
here's my firebase.json file :
{
"functions": {
"predeploy": "npm --prefix \"$RESOURCE_DIR\" run build",
"source": "functions"
},
"emulators": {
"functions": {
"port": 8201
},
"firestore": {
"port": 9288
},
"database": {
"port": 6120
},
"ui": {
"enabled": true
}
}
}
and my package.json file :
{
"name": "functions",
"scripts": {
"build": "tsc",
"serve": "npm run build && firebase emulators:start --import ../../database",
"shell": "npm run build && firebase functions:shell",
"start": "npm run shell",
"deploy": "npm run build && firebase deploy --only functions",
"logs": "firebase functions:log",
"test": "mocha -r ts-node/register tests/**/*.test.ts"
},
"engines": {
"node": "10"
},
"main": "lib/index.js",
"dependencies": {
"firebase-admin": "^9.4.2",
"firebase-functions": "^3.13.0",
"geofire-common": "^5.2.0",
"geolib": "^3.3.1",
"moment-timezone": "^0.5.32",
"tmp": "^0.2.1",
"xlsx": "^0.17.2"
},
"devDependencies": {
"#types/chai": "^4.2.18",
"#types/mocha": "^8.2.2",
"#types/tmp": "^0.2.1",
"chai": "^4.3.4",
"firebase-functions-test": "^0.2.0",
"mocha": "^9.0.0",
"ts-node": "^9.0.0",
"typescript": "^3.8.0"
},
"private": true
}
Thanks a lot guys!
Turns out i needed to update firebase-admin to latest version inside functions folder..
npm i firebase-admin
works for me!
I am trying to test my cloud functions locally. I am using the command firebase functions:shell which starts the emulator successfully. I have the following cloud function in my index.ts:
export const stripeCharge = functions.region('europe-west1').database
.ref('/payments/{userId}/{paymentId}')
.onWrite(async (change, context) => {
someCode;
});
I read that you should invoke an onWrite firestore function the following way (https://firebase.google.com/docs/functions/local-shell):
stripeCharge({before: "oldData", after: "newData"})
However, this results in the following error:
'Successfully invoked function.'
firebase > ! TypeError: Cannot read property 'eventType' of undefined
at cloudFunction (C:\Users\Jesper\intergun\functions\node_modules\firebase-functions\lib\cloud-functions.js:80:40)
at Run (C:\Users\Jesper\AppData\Roaming\nvm\v8.16.0\node_modules\firebase-tools\lib\emulator\functionsEmulatorRuntime.js:458:20)
at C:\Users\Jesper\AppData\Roaming\nvm\v8.16.0\node_modules\firebase-tools\lib\emulator\functionsEmulatorRuntime.js:442:19
at Generator.next (<anonymous>)
at C:\Users\Jesper\AppData\Roaming\nvm\v8.16.0\node_modules\firebase-tools\lib\emulator\functionsEmulatorRuntime.js:7:71
at new Promise (<anonymous>)
at __awaiter (C:\Users\Jesper\AppData\Roaming\nvm\v8.16.0\node_modules\firebase-tools\lib\emulator\functionsEmulatorRuntime.js:3:12)
at Run (C:\Users\Jesper\AppData\Roaming\nvm\v8.16.0\node_modules\firebase-tools\lib\emulator\functionsEmulatorRuntime.js:435:12)
at C:\Users\Jesper\AppData\Roaming\nvm\v8.16.0\node_modules\firebase-tools\lib\emulator\functionsEmulatorRuntime.js:457:15
at Generator.next (<anonymous>)
! Your function was killed because it raised an unhandled error.
The error happens in some other file and I'm not sure why. What am I missing?
Edit: My package.json:
{
"name": "functions",
"scripts": {
"lint": "tslint --project tsconfig.json",
"build": "tsc",
"serve": "npm run build && firebase serve --only functions",
"shell": "npm run build && firebase functions:shell",
"start": "npm run shell",
"deploy": "firebase deploy --only functions",
"logs": "firebase functions:log"
},
"engines": {
"node": "8"
},
"main": "lib/index.js",
"dependencies": {
"#google-cloud/storage": "^2.5.0",
"#types/fs-extra": "^7.0.0",
"firebase-admin": "^8.1.0",
"firebase-functions": "^3.0.1",
"fs-extra": "^8.0.1",
"mailgun-js": "^0.22.0",
"sharp": "^0.22.1",
"stripe": "^7.1.0"
},
"devDependencies": {
"#types/sharp": "^0.22.2",
"#types/stripe": "^6.30.0",
"firebase-functions-test": "^0.1.6",
"tslint": "^5.12.0",
"typescript": "^3.2.2"
},
"private": true
}
After replicating this I've found this thread it looks there is an open case for this issue.
The similar setup works fine for Firestore, but the issue seems to to be with the RTDB, I assume we have to wait until they solve it, sorry :(
I'm following the example from the github repository to short a link url
https://github.com/firebase/functions-samples/tree/Node-8/url-shortener
The error is giving is the following
12:49:56.472 a. m. shortenUrl Function execution took 509 ms, finished
with status: 'error' 12:49:56.464 a. m. shortenUrl RequestError:
Error: getaddrinfo EAI_AGAIN api-ssl.bitly.com:443
at new RequestError (/srv/node_modules/request-promise-core/lib/errors.js:14:15)
at Request.plumbing.callback (/srv/node_modules/request-promise-core/lib/plumbing.js:87:29)
at Request.RP$callback [as _callback] (/srv/node_modules/request-promise-core/lib/plumbing.js:46:31)
at self.callback (/srv/node_modules/request/request.js:185:22)
at emitOne (events.js:116:13)
at Request.emit (events.js:211:7)
at Request.onRequestError (/srv/node_modules/request/request.js:881:8)
at emitOne (events.js:116:13)
at ClientRequest.emit (events.js:211:7)
at TLSSocket.socketErrorListener (_http_client.js:387:9)
at emitOne (events.js:116:13)
at TLSSocket.emit (events.js:211:7)
at emitErrorNT (internal/streams/destroy.js:64:8)
at _combinedTickCallback (internal/process/next_tick.js:138:11)
at process._tickDomainCallback (internal/process/next_tick.js:218:9)
I'm really new at functions but I did follow all the steps from the documentation there.
here is my index.js inside my functions folder
const functions = require('firebase-functions');
const BitlyClient = require('bitly');
// TODO: Make sure to set the bitly.access_token cloud functions config using the CLI.
const bitly = BitlyClient(functions.config().bitly.access_token);
// Shorten URL written to /links/{linkID}.
exports.shortenUrl = functions.database.ref('/links/{linkID}').onCreate(async (snap) => {
const originalUrl = snap.val();
const response = await bitly.shorten(originalUrl);
return snap.ref.set({
original: originalUrl,
short: response.data.url,
})
});
and my package.json in order to compile the the neccesary for bitly
{
"name": "url-shortener-functions",
"description": "URL Shortener Firebase Functions sample",
"dependencies": {
"bitly": "^5.1.7",
"firebase-admin": "~6.0.0",
"firebase-functions": "^2.0.5"
},
"devDependencies": {
"eslint": "^4.13.1",
"eslint-plugin-promise": "^3.6.0"
},
"scripts": {
"lint": "./node_modules/.bin/eslint --max-warnings=0 .",
"serve": "firebase serve --only functions",
"shell": "firebase experimental:functions:shell",
"start": "npm run shell",
"deploy": "firebase deploy --only functions",
"logs": "firebase functions:log"
},
"engines": {
"node": "8"
},
"private": true
}
I also did npm -install bitly inside my functions folder but still throwing that error
Also I added my link inside my database as the documentation states
/functions-project-12345
/links
link-123456: "https://my.super.long-link.com/api/user/profile/-jEHitne10395-k3593085"
Any clue ? thanks
it complains, that it cannot resolve for the remote host:
RequestError: Error: getaddrinfo EAI_AGAIN api-ssl.bitly.com:443
therefore I'd assume, that a paid plan is required, in order to perform this external API call.