جاوااسکریپت - مانگوئوس و چندین پایگاه داده در یک پروژه نود.جیاس


من دارم یک پروژه Node.js انجام میدهم که شامل زیرپروژههایی است. یکی از زیرپروژهها یک پایگاه داده MongoDB خواهد داشت و Mongoose برای بستهبندی و پرسوجوی پایگاه داده استفاده خواهد شد. اما مشکل این است

  • مانگووز اجازه نمیدهد از چندین پایگاه داده در یک نمونه مانگووز استفاده شود زیرا مدلها بر اساس یک اتصال ساخته میشوند.
  • برای استفاده از چندین نمونه mongoose، Node.js اجازه چندین نمونه ماژول را نمیدهد زیرا دارای سیستم کش در require() است. من میدانم که میتوان کش ماژول را در Node.js غیرفعال کرد اما فکر میکنم این راه حل خوبی نیست زیرا فقط برای mongoose نیاز است.

    من سعی کردم از createConnection() و openSet() در mongoose استفاده کنم، اما این راه حل نبود.

    من سعی کردهام که نمونهی mongoose را به صورت عمیق کپی کنم (http://blog.imaginea.com/deep-copy-in-javascript/) تا نمونههای جدید mongoose را به زیرپروژه منتقل کنم، اما این خطا را میدهد: RangeError: Maximum call stack size exceeded.

من میخواهم بدانم آیا راهی برای استفاده از چند پایگاه داده با مانگوز یا هر راهحل دیگری برای این مشکل وجود دارد؟ چون فکر میکنم مانگوز نسبتاً آسان و سریع است. یا ماژولهای دیگری به عنوان توصیه وجود دارد؟

پاسخ شماره ۱

طبق راهنمای دقیق، 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' }
}));

من کاملاً مطمئن هستم که میتوانید طرح را بین آنها به اشتراک بگذارید، اما باید بررسی کنید تا مطمئن شوید.

پاسخ شماره ۲

خیلی دیر است اما ممکن است به کسی کمک کند. پاسخهای فعلی فرض میکنند که شما از همان فایل برای ارتباطات و مدلهای خود استفاده میکنید.

در زندگی واقعی، احتمال زیادی وجود دارد که مدلهای خود را به فایلهای مختلف تقسیم کنید. میتوانید چیزی شبیه این را در فایل اصلی خود استفاده کنید:

mongoose.connect('mongodb://localhost/default');

const db = mongoose.connection;

db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', () => {
  console.log('connected');
});

که دقیقاً همانطور است که در مستندات توصیف شده است. و سپس در فایلهای مدل خود، چیزی شبیه به موارد زیر انجام دهید:

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;

جایی که myDB نام پایگاه داده شما است.

پاسخ شماره ۳

یکی از کارهایی که میتوانید انجام دهید این است که ممکن است برای هر پروژه، زیرپوشههایی داشته باشید. بنابراین، mongoose را در آن زیرپوشهها نصب کنید و mongoose را از پوشههای خود در هر زیر برنامه require() کنید، نه از ریشه پروژه یا به صورت جهانی. بنابراین یک زیر پروژه، یک نصب 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/

در foo_db_connect.js

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/foo_db');
module.exports = exports = mongoose;

در bar_db_connect.js

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/bar_db');
module.exports = exports = mongoose;

در فایلهای db_access.js

var mongoose = require("./foo_db_connect.js"); // bar_db_connect.js for bar app

اکنون میتوانید با Mongoose به چندین پایگاه داده دسترسی پیدا کنید.

پاسخ شماره ۴

به عنوان یک رویکرد جایگزین، Mongoose یک سازنده برای یک نمونه جدید روی نمونه پیشفرض صادر میکند. بنابراین چیزی شبیه به این امکانپذیر است.

var Mongoose = require('mongoose').Mongoose;

var instance1 = new Mongoose();
instance1.connect('foo');

var instance2 = new Mongoose();
instance2.connect('bar');

این زمانی بسیار مفید است که با منابع داده جداگانه کار میکنید، و همچنین وقتی که میخواهید یک زمینه پایگاه داده جداگانه برای هر کاربر یا درخواست داشته باشید. باید مراقب باشید، زیرا ایجاد تعداد زیادی اتصال هنگام انجام این کار امکانپذیر است. مطمئن شوید که وقتی نمونهها مورد نیاز نیستند، متد disconnect() را فراخوانی کنید و همچنین اندازه استخر ایجاد شده توسط هر نمونه را محدود کنید.