我想了解如何在猫鼬全局Promise连接内的数据库之间进行切换。
我当前的连接是通过app.ts
import * as mongoose from 'mongoose';
...
try {
await mongoose.createConnection(`mongodb://localhost:27017/db1`, {
useNewUrlParser: true,
})
console.log("Connected")
} catch (error) {
console.log(error)
}
然后我在不同的文件some.model.ts
import { Schema, Document, model } from 'mongoose';
const SomeSchema: Schema = new Schema({
name: { type: String, required: true },
owner: { type: string, required: true }
});
export default model('Some', SomeSchema);
根据文档。
到目前为止,我们已经了解了如何使用Mongoose的默认连接连接到MongoDB。有时,我们可能需要打开多个连接到Mongo,每个连接具有不同的读/写设置,或者可能仅连接到不同的数据库。在这些情况下,我们可以利用mongoose.createConnection()接受已经讨论过的所有参数,并为您返回一个新的连接。
const conn = mongoose.createConnection('mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]', options);
我可以这样创建多个数据库连接
try {
const db1 = await mongoose.createConnection(`mongodb://localhost:27017/db1`, {
useNewUrlParser: true,
})
const db2 = await mongoose.createConnection(`mongodb://localhost:27017/db2`, {
useNewUrlParser: true,
})
console.log("Connected")
} catch (error) {
console.log(error)
}
我可以在console.log(mongoose.connections)
但是如何在some.model.ts
中为模型指定应使用哪个数据库?
import { Schema, Document, model } from 'mongoose';
const SomeSchema: Schema = new Schema({
name: { type: String, required: true },
owner: { type: string, required: true }
});
export default SPECIFY_DATABASE.model('Some', SomeSchema);
我发现了诸如this之类的其他问题,但是有创建为“ localy”的连接,我需要在许多不同文件中使用猫鼬连接。
谢谢您的回答,如果您需要更多说明,请立即让我来。
答案 0 :(得分:0)
您需要实际返回连接,然后将给定模型注册到每个连接。为了澄清,您需要:
例如,让我们通过单个导出创建一个“ db.js”文件(通常我将其称为“ repo.js”),该函数返回已初始化的数据库Promise。 您可以通过导入函数并等待数据库来使用它。
我有一个更长的例子,为简洁起见,省略了错误处理等。
import { createConnections } from './create-connections';
import { UsersSchema } from './users-schema';
import { PostsSchema } from './posts-schema';
let db: any;
export function getDatabase(): Promise<any> {
if (this.db) return Promise.resolve(db);
return createDatabases();
}
async function createDatabases() {
const { db1, db2 } = await createConnections('mongodb://localhost/db1', 'mongodb://localhost/db2');
const UserModel = db1.model('users', UserSchema);
const PostModel = db2.model('posts', PostSchema);
db = {
UserModel,
PostModel,
// also if you need this
connections: {
db1,
db2,
}
}
return db;
}
现在,我在这里使用了'./create-connections'
,这几乎是您所拥有的:
// create-connection.js
const { createConnection } = require('mongoose');
// You create connections by calling this function and giving it the URL to the server
export function createConnections(url1, url2) {
const db1 = await createConnection(url1);
const db2 = await createConnection(url2);
return {
db1,
db2
}
}
现在,假设您有两个模型:用户和帖子,让我们拥有他们的模式。
// users schema
import { Schema, Document } from 'mongoose';
export const UserSchema: Schema = new Schema({
name: { type: String, required: true },
});
// posts schema
import { Schema, Document } from 'mongoose';
export const PostSchema: Schema = new Schema({
text: { type: String, required: true },
owner: { type: SchemaID, required: true }
});
所以现在您需要将所有内容绑定到该fdirst文件中。
但是如何使用呢?就像我说过的那样,由于它是异步的,因此您始终要导入它并将其用作简单的异步getDB:
// some controller, route handler, service etc.
import { getDatabase } from './get-database';
router.get('/users', async (req, res) => {
const User = await getDatabase().UserModel;
const users = await User.find();
return res.json(users);
});
router.post('/posts', async (req, res) {
const { text } = req.body;
const owner = req.user.id;
const Post = await getDatabase().PostModel;
const post = await Post.create({ text, owner });
return res.json(post);
});