【问题标题】:Mongoose - multiple database connectionsMongoose - 多个数据库连接
【发布时间】:2019-11-29 14:48:18
【问题描述】:

我想了解如何在 mongoose 全局承诺连接中在数据库之间切换。

我当前的连接是这样建立的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,但是创建了“本地”连接,我需要在许多不同的文件中使用猫鼬连接。

感谢您的回答,如果您需要更多解释,请现在告诉我。

【问题讨论】:

    标签: node.js mongodb typescript mongoose


    【解决方案1】:

    您需要实际返回连接,然后将给定模型注册到每个连接。为了澄清,您需要:

    • 创建(命名的、特定的)连接的东西
    • 模式
    • 您通过将架构注册到给定连接来创建模型,
    • 您还需要一些东西来编排它。

    例如,让我们有一个带有单个导出的“db.js”文件(我通常称为“repo.js”),这是一个返回初始化数据库 Promise 的函数。 您可以通过导入函数并等待 db 来使用它。

    我有一个较长的示例,因此为简洁起见省略了错误处理等。

    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);      
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-14
      • 1970-01-01
      • 2014-07-18
      • 1970-01-01
      • 1970-01-01
      • 2011-09-13
      • 1970-01-01
      • 2017-08-12
      相关资源
      最近更新 更多