-
Notifications
You must be signed in to change notification settings - Fork 972
Description
[REQUIRED] Describe your environment
- Operating System version: macOS 10.15.6 (19G73)
- firebase-admin SDK version: 9.1.1
- firebase-tools version: 8.9.0
- @firebase/database version: 0.6.11
- RTDB emulator version: 4.5.0
- Firebase Product: database, testing-sdk
- Node.js version: 14.8.0
[REQUIRED] Describe the problem
When using multiple database instances (via app.database(URL)
) with the firebase-tools emulator errors are thrown.
Steps to reproduce:
const { app } = require('firebase-admin')
const _app = require('firebase-admin').initializeApp({
databaseURL: 'https://against-emulator.firebaseio.com'
})
Promise.resolve(_app).then(async app => {
const mainInstance = app.database()
console.log('Main DB:', mainInstance['repo_']['repoInfo_'])
const mainInstanceRef = mainInstance.ref('root')
console.log('Main DB ref:', mainInstanceRef.toString())
const otherInstance = app.database('https://against-emulator-other-instance.firebaseio.com')
console.log('Other DB:', otherInstance['repo_']['repoInfo_'])
const otherInstanceRef = otherInstance.ref('root')
console.log('Other DB ref:', otherInstanceRef.toString())
})
.catch(err => console.error('Error - ', err))
.finally(() => _app.delete())
Run the above code with just node script.js
and the following is outputted with no errors:
Main DB: RepoInfo {
secure: true,
namespace: 'against-emulator',
webSocketOnly: false,
persistenceKey: '',
includeNamespaceInQueryParams: false,
host: 'against-emulator.firebaseio.com',
domain: 'firebaseio.com',
internalHost: 'against-emulator.firebaseio.com'
}
Main DB ref: https://against-emulator.firebaseio.com/root
Other DB: RepoInfo {
secure: true,
namespace: 'against-emulator-other-instance',
webSocketOnly: false,
persistenceKey: '',
includeNamespaceInQueryParams: false,
host: 'against-emulator-other-instance.firebaseio.com',
domain: 'firebaseio.com',
internalHost: 'against-emulator-other-instance.firebaseio.com'
}
Other DB ref: https://against-emulator-other-instance.firebaseio.com/root
Now running against the DB emulator firebase emulators:exec --project against-emulator --only database 'node script.js'
, errors occur:
Main DB: RepoInfo {
secure: false,
namespace: 'against-emulator',
webSocketOnly: false,
persistenceKey: '',
includeNamespaceInQueryParams: true,
host: 'localhost:9000',
domain: 'localhost:9000',
internalHost: 'localhost:9000'
}
Main DB ref: http://localhost:9000/root
[2020-08-25T13:22:27.260Z] @firebase/database: FIREBASE FATAL ERROR: Database initialized multiple times. Please make sure the format of the database URL matches with each database() call.
Error - Error: FIREBASE FATAL ERROR: Database initialized multiple times. Please make sure the format of the database URL matches with each database() call.
at fatal (<path>/node_modules/@firebase/database/dist/index.node.cjs.js:341:11)
at RepoManager.createRepo (<path>/node_modules/@firebase/database/dist/index.node.cjs.js:15047:13)
at RepoManager.databaseFromApp (<path>/node_modules/@firebase/database/dist/index.node.cjs.js:15014:25)
at Object.initStandalone (<path>/node_modules/@firebase/database/dist/index.node.cjs.js:15389:45)
at DatabaseService.getDatabase (<path>/node_modules/firebase-admin/lib/database/database-internal.js:82:23)
at FirebaseApp.database (<path>/node_modules/firebase-admin/lib/firebase-app.js:232:24)
at <path>/script.js:12:30
Relevant Code:
This is the bit of code throwing the error:
firebase-js-sdk/packages/database/src/core/RepoManager.ts
Lines 187 to 192 in 96076f0
let repo = safeGet(appRepos, repoInfo.toURLString()); | |
if (repo) { | |
fatal( | |
'Database initialized multiple times. Please make sure the format of the database URL matches with each database() call.' | |
); | |
} |
It seems that RepoInfo#toURLString
:
firebase-js-sdk/packages/database/src/core/RepoInfo.ts
Lines 128 to 130 in 96076f0
toURLString(): string { | |
return (this.secure ? 'https://' : 'http://') + this.host; | |
} |
Doesn't take into account the namespace
of the RepoInfo
which the emulator uses to distinguish between different DB instances.