When you export a variable, you're exporting what's stored in the variable, not the variable itself. Assigning to the variable will only change the variable, but will not affect what was exported.
Think of it like this:
let a = null;
let b = a;
a = 'something';
console.log(b);
// null
Note how storing something new in a
doesn't change what's stored in b
.
To do something like what you want in your question, you need to export an object and update references on that object:
init.js
export default async () => {
return await initializeWhatever()
}
db-module.js
import init from './init'
const dbModule = { db: null };
init().then(val => dbModule.db = val)
export default dbModule
api.js
import dbModule from './db-module'
const doApi = req => {
dbModule.db.select({username:req.param.username})
}
Obviously you might want to change some names to make things cleaner. I don't know a lot about your project so I'm not sure how to name them.
Also, you'll have to make sure have some way of making sure that any uses of your dbModule.db
object happen after it's actually in place. In other words, you have to make sure there's no way doApi
in api.js
can be invoked before init
in db-module.js
finishes.
To do this, you'll need to make the promise chain from init
available to api.js
:
init.js
export default async () => {
return await initializeWhatever()
}
db-module.js
import init from './init'
const dbModule = { db: null };
dbModule.promise = init().then(val => dbModule.db = val)
export default dbModule
api.js
import dbModule from './db-module'
const doApi = req => {
dbModule.db.select({username:req.param.username})
}
dbModule.promise.then(() => {
// Set up routes and start listening in this promise chain.
// Ensure there is no way `doApi` can be called before this happens.
});
Why does this work? Because in JS, variables don't store entire copies of objects. They simply store references. If two variables point at the same object, changes to the object will be reflected whether your access it through one variable or another. Think of it like this:
let c = { prop: null };
let d = c;
c.prop = 'something';
console.log(d.prop);
// 'something'