簡體   English   中英

貓鼬-多個數據庫連接

[英]Mongoose - multiple database connections

我想了解如何在貓鼬全局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指定應將哪個數據庫用於Model?

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

我發現像其他問題, 但也有創造“localy”的連接,我需要使用許多不同的文件貓鼬的連接。

感謝您的回答,如果您需要更多說明,請立即讓我。

您需要實際返回連接,然后將給定的模型注冊到每個連接。 為了澄清,您需要:

  • 創建(命名的,特定的)連接的東西
  • 模式
  • 您可以通過將架構注冊到給定的連接來創建模型,
  • 您還需要一些東西來編排它。

例如,讓我們通過單個導出創建一個“ 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);      
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM