如何使用mongoose创建一个模块来共享不断变化的数据库连接



我一直在开发一个应用程序(Node.js和MongoDB使用mongoose(,服务器连接到两个不同的数据库,一个通用数据库包含用于用户身份验证的用户名和密码对。然后,当用户登录时,我想连接到另一个数据库,该数据库以用户的userId命名。我设法创建了一个用于共享通用UA数据库的模块,但第二个模块更难,因为它不会在连接时打开,但稍后,当用户登录时。我想我受到了反应上下文共享的启发。

到目前为止,我有一个类似的东西

const mongoose = require("mongoose");
/* 
UA = User Authentication
US = User Specific
DB = DataBase
*/
const UA_DB = mongoose.createConnection(/*...*/);
);
const User = UA_DB.model("User", require("../../data-schemas/user"));
let US_DB, Order, Item, Ingredient, Place;
console.log("opened UA database");
function sendUserId(newUserId) {
userId = newUserId;
US_DB = mongoose.createConnection(/*... ${newUserId} ...*/ );
Order = US_DB.model("Order", require("../../data-schemas/order"));
Item = US_DB.model("Item", require("../../data-schemas/item"));
Ingredient = US_DB.model(
"Ingredient",
require("../../data-schemas/ingredient")
);
Place = US_DB.model("Place", require("../../data-schemas/place"));
console.log("opened US database");
}
module.exports = {
UA_DB: {
User,
},
US_DB: {
Order,
Item,
Ingredient,
Place,
},
sendUserId,
};

现在,如果我没有说清楚的话,首先,UA_DB工作得很好,用户登录也很好。。。当涉及到US_DB时,我总是得到未定义的值(无法读取未定义的属性'find'(。我怀疑问题可能是,导出的值不会随着变量的值而更新。有什么想法,怎么解决?

好吧,我想明白了。我没有使用精确的值,而是使用一个函数来返回它们,并连接到数据库。UserId存储在一个令牌中,所以在验证之后,我检查我是否已经连接到了正确的数据库(使用UserId变量,它存储以前的值(,然后返回模型的curretn值,现在我的代码看起来像这个

const mongoose = require("mongoose");
/* 
UA = User Authentication
US = User Specific
DB = DataBase
*/
const UA_DB = mongoose.createConnection(/* ... */
);
const User = UA_DB.model("User", require("../../data-schemas/user"));
let US_DB,
Order,
Item,
Ingredient,
Place = "some default value";
console.log("opened UA database");
let userId = "";
function getUS_DBModels(newUserId) {
if (newUserId !== userId) {
userId = newUserId;
US_DB = mongoose.createConnection(`...${userId}...`
);
Order = US_DB.model("Order", require("../../data-schemas/order"));
Item = US_DB.model("Item", require("../../data-schemas/item"));
console.log("opened a US_DB connection");
Ingredient = US_DB.model(
"Ingredient",
require("../../data-schemas/ingredient")
);
Place = US_DB.model("Place", require("../../data-schemas/place"));
}
return {
Order, Item, Ingredient, Place
}
}
module.exports = {
UA_DB: {
User,
},
getUS_DBModels,
};

对于任何想知道的人,在不同的模块中,你可以访问像这个这样的值

const dbHandler = require("./path/to/the/module");
const { Item } = dbHandler.getUS_DBModels("UserId");

最新更新