It would be great to run the Database emulator in a console and then, for example, the functions emulator in another console. In this fashion, You could upload your test-data to the Realtime DB and test/debug your function many times without having to reload all the test-data.
I tried to run only the database in a console like this:
firebase emulators:start --only database
But when I do the same for functions, the emulator hub gets deployed on the next port, so the database and the functions won't communicate to each other, i.e. the triggers won't fire at delete/create/etc. events on the DB.
I tried to find a way to tell the emulator to use a particular running hub, but still no luck.
Any help would be much appreciated.
Related
I am having trouble running the firebase functions emulator towards a production database. I have a project which is not publicly released yet so I can run towards production with any negative effects.
My project uses only the realtime database, it does not use Firestore (so other questions on SO are not relevant) The documentation states "Cloud Firestore and Realtime Database triggers already have sufficient credentials, and do not require additional setup." so according to that, I shouldn't need any additional setup in order to point to the production database.
According to all of the documentation on Firebase, the project should run towards the real firebase database if I only start the functions emulator and do not start the database emulator. This warning seems to say so, too:
functions: The following emulators are not running, calls to these services from the Functions emulator will affect production: auth, firestore, database, hosting, pubsub
However, this is not what happens. Instead, I get the following error:
functions[onGlobalClientRequest]: function ignored because the database emulator does not exist or is not running.
I have read the firebase documentation and nothing is really mentioned other than setting credentials should not be needed (but I am setting credentials anyway using export GOOGLE_APPLICATION_CREDENTIALS="/path/to/credentials.json" before running the functions emulator.)
onGlobalClientRequest looks like this:
export const onGlobalClientRequest = functions.database
.ref( client_requests_key + "/{pushedid}")
.onCreate(
async (
snap: functions.database.DataSnapshot,
context: functions.EventContext,
) => {
///.... code here...
},
);
The locally emulated Firebase Functions will be able to write to the Prod database, but will not be able to get triggered by the production database.
Here is a SO answer from a Google employee that states the aforementioned.
Also, quoting from this other SO answer from another Google employee:
In general the rule with emulators:start is that we comprehensively emulate whatever is running. So for example if you're running the Functions and Database emulator, all writes from functions (through admin.database().... will be redirected to the Database emulator. But writes to Firestore (admin.firestore()...) will try and hit production because that emulator is not running.
Operations on a Realtime Database (RTDB) trigger the functions in the corresponding project. So the production RTDB triggers functions of your production project, and the emulated RTDB triggers emulated functions.
If you want to test functions triggered by RTDB operations locally with the emulator, you have to use the RTDB emulator as well. This is explained in the doc here.
If you only want to test HTTP callable functions, then you can use a remote RTDB.
Streaming Firebase Function logs to a local terminal would be very helpful since the Firebase Console web interface for logs is pretty sluggish to work with.
Does any one know a way to achieve this?
Using the Firebase CLI, according to the documentation, run the command:
firebase functions:log
This gives you a dump of recent logs, but it doesn't "stream" them to your terminal. Unfortunately, this is the best you can do.
If you're a gcloud user, there are equivalent commands, as described in its documentation. There is also no option to stream the logs live with gcloud.
If you want a "live" view of logs of your deployed functions, you're going to have to use the Firebase or Google Cloud console.
If you're doing active development and need the logs for code you've just written, it might be easier to use the Firebase emulator suite to run functions locally, so you can see logs appear live in the terminal where the emulator is running.
I'm building a firebase API with cloud functions and want to reach my production Database for local testing.
My problem :
When I launch my two firebase emulator (functions and firestore) with
firebase emulators:start
1- My custom API endpoints run on http://localhost:5001 (this works)
2- My triggers reaches a local dababase on http://localhost:8080 whereas I didn't set FIRESTORE_EMULATOR_HOST=localhost:8080 (I want to reach my production database)
OR
When I launch only my "functions emulator" with
firebase emulators:start --only function
...but my triggers are not reached, probably because of this warning
i functions[userOnCreate]: function ignored because the firestore emulator does not exist or is not running.
On the other side I'm building a reactjs App also with firebase running on localhost:3000
I call my local API from this app with firebase SDK. To reach my emulator, I add the line :
firebase.functions.useFunctionsEmulator('http://localhost:5001');
The local emulators don't work with actual cloud-hosted instances of databases. Everything must be local.
You are always free to file a feature request.
you have to use firebase serve instead for firebase emulators:start
When running firebase serve --port 9000 I serve my firebase app but the console message ends with
Ignoring trigger "onJobWrite" because the Realtime Database emulator is not running.
I can run firebase emulators:start --only database to get the emulator up and running manually but it doesn't seem to work to run it separately.
As far as I can see the function I'm running is not the local one but the one in the cloud and that's not what I want as my trigger is local.
What can I do to make the database trigger the database locally?
I have a firebase functions project that connects to a firebase database in the cloud. If I write a database trigger in my firebase functions, and I emulate those functions locally, will the trigger fire? I mean, because the database is running on the cloud, does it even know about my locally running trigger?
No, the local emulator doesn't work that way. The only way you can trigger a database function with the emulator is through the command prompt you're provided with.