pup*_*pot 108 javascript database mongoose mongodb node.js
我正在做一个包含子项目的Node.js项目.一个子项目将有一个Mongodb数据库,Mongoose将用于包装和查询db.但问题是
要使用多个mongoose实例,Node.js不允许多个模块实例,因为它具有缓存系统require()
.我知道在Node.js中禁用模块缓存,但我认为这不是一个好的解决方案,因为它只需要mongoose.
我曾尝试使用createConnection()
和openSet()
猫鼬,但它不是解决方案.
我试图深度复制mongoose实例(http://blog.imaginea.com/deep-copy-in-javascript/)以将新的mongoose实例传递给子项目,但它会抛出RangeError: Maximum call stack size exceeded
.
我想知道是否有使用多个数据库与mongoose或任何解决方法来解决这个问题?因为我认为猫鼬非常容易和快速.或任何其他模块作为建议?
rob*_*lep 194
根据精细手册,createConnection()
可用于连接多个数据库.
但是,您需要为每个连接/数据库创建单独的模型:
var conn = mongoose.createConnection('mongodb://localhost/testA');
var conn2 = mongoose.createConnection('mongodb://localhost/testB');
// stored in 'testA' database
var ModelA = conn.model('Model', new mongoose.Schema({
title : { type : String, default : 'model in testA database' }
}));
// stored in 'testB' database
var ModelB = conn2.model('Model', new mongoose.Schema({
title : { type : String, default : 'model in testB database' }
}));
Run Code Online (Sandbox Code Playgroud)
我很确定你可以在它们之间共享架构,但你必须检查以确保它.
小智 34
您可以做的一件事是,您可能拥有每个项目的子文件夹.因此,在子文件夹中安装mongoose,并在每个子应用程序中从自己的文件夹中安装require()mongoose.不是来自项目根目录或来自全局.所以一个子项目,一个mongoose安装和一个mongoose实例.
-app_root/
--foo_app/
---db_access.js
---foo_db_connect.js
---node_modules/
----mongoose/
--bar_app/
---db_access.js
---bar_db_connect.js
---node_modules/
----mongoose/
Run Code Online (Sandbox Code Playgroud)
在foo_db_connect.js中
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/foo_db');
module.exports = exports = mongoose;
Run Code Online (Sandbox Code Playgroud)
在bar_db_connect.js中
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/bar_db');
module.exports = exports = mongoose;
Run Code Online (Sandbox Code Playgroud)
在db_access.js文件中
var mongoose = require("./foo_db_connect.js"); // bar_db_connect.js for bar app
Run Code Online (Sandbox Code Playgroud)
现在,您可以使用mongoose访问多个数据库.
Eri*_*ric 31
作为替代方法,Mongoose会在默认实例上为新实例导出构造函数.所以这样的事情是可能的.
var Mongoose = require('mongoose').Mongoose;
var instance1 = new Mongoose();
instance1.connect('foo');
var instance2 = new Mongoose();
instance2.connect('bar');
Run Code Online (Sandbox Code Playgroud)
这在处理单独的数据源时非常有用,并且当您希望为每个用户或请求创建单独的数据库上下文时也是如此.您需要小心,因为在执行此操作时可能会创建大量连接.确保在不需要实例时调用disconnect(),并限制每个实例创建的池大小.
Tah*_*sin 25
很晚但这可能对某人有所帮助.当前答案假定您使用相同的文件作为连接和模型.
在现实生活中,很有可能将模型分成不同的文件.你可以在主文件中使用这样的东西:
mongoose.connect('mongodb://localhost/default');
const db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', () => {
console.log('connected');
});
Run Code Online (Sandbox Code Playgroud)
这就是文档中描述的内容.然后在您的模型文件中,执行以下操作:
import mongoose, { Schema } from 'mongoose';
const userInfoSchema = new Schema({
createdAt: {
type: Date,
required: true,
default: new Date(),
},
// ...other fields
});
const myDB = mongoose.connection.useDb('myDB');
const UserInfo = myDB.model('userInfo', userInfoSchema);
export default UserInfo;
Run Code Online (Sandbox Code Playgroud)
myDB是您的数据库名称.
小智 7
单个 Node.js 项目中的 Mongoose 和多个数据库
使用useDb解决这个问题
例子
//product databse
const myDB = mongoose.connection.useDb('product');
module.exports = myDB.model("Snack", snackSchema);
//user databse
const myDB = mongoose.connection.useDb('user');
module.exports = myDB.model("User", userSchema);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
79395 次 |
最近记录: |