Sto facendo un progetto Node.js che contiene progetti secondari. Un sottoprogetto avrà un database Mongodb e Mangusta verrà utilizzata per il wrapping e l’interrogazione di db. Ma il problema è
Per utilizzare più istanze di mangusta, Node.js non consente più istanze di moduli poiché ha il sistema di memorizzazione nella cache in require()
. So disabilitare il caching dei moduli in Node.js, ma penso che non sia la soluzione migliore in quanto è solo bisogno di mangusta.
Ho provato a usare createConnection()
e openSet()
in mangusta, ma non era la soluzione.
Ho provato a copiare in profondità l’istanza di mangusta ( http://blog.imaginea.com/deep-copy-in-javascript/ ) per passare nuove istanze di mangusta al sottoprogetto, ma RangeError: Maximum call stack size exceeded
.
Voglio sapere se è comunque ansible utilizzare più database con mangusta o soluzioni alternative per questo problema? Perché penso che la mangusta sia abbastanza facile e veloce. O altri moduli come raccomandazioni?
Una cosa che puoi fare è che potresti avere sottocartelle per ogni progetto. Quindi, installa mangusta in quelle sottocartelle e richiede () mangusta dalle proprie cartelle in ogni sottoapplicazione. Non dalla radice del progetto o dal globale. Quindi un progetto secondario, un’installazione di mangusta e un’istanza di mangusta.
-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/
In foo_db_connect.js
var mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/foo_db'); module.exports = exports = mongoose;
In bar_db_connect.js
var mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/bar_db'); module.exports = exports = mongoose;
Nei file db_access.js
var mongoose = require("./foo_db_connect.js"); // bar_db_connect.js for bar app
Ora puoi accedere a più database con mangusta.
Secondo il manuale fine , createConnection()
può essere utilizzato per connettersi a più database.
Tuttavia, è necessario creare modelli separati per ogni connessione / database:
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' } }));
Sono abbastanza sicuro che è ansible condividere lo schema tra di loro, ma è necessario verificare per assicurarsi.
Come approccio alternativo, Mongoose esporta un costruttore per una nuova istanza sull’istanza predefinita. Quindi qualcosa del genere è ansible.
var Mongoose = require('mongoose').Mongoose; var instance1 = new Mongoose(); instance1.connect('foo'); var instance2 = new Mongoose(); instance2.connect('bar');
Questo è molto utile quando si lavora con origini dati separate e anche quando si desidera avere un contesto di database separato per ogni utente o richiesta. Dovrai stare attento, dato che è ansible creare MOLTE connessioni quando si fa questo. Assicurati di chiamare disconnect () quando le istanze non sono necessarie e anche di limitare la dimensione del pool creata da ogni istanza.
Piuttosto tardi, ma questo potrebbe aiutare qualcuno. Le risposte correnti presuppongono che si stia utilizzando lo stesso file per le connessioni e i modelli.
Nella vita reale, c’è un’alta probabilità che tu divida i tuoi modelli in file diversi. Puoi usare qualcosa di simile nel tuo file principale:
mongoose.connect('mongodb://localhost/default'); const db = mongoose.connection; db.on('error', console.error.bind(console, 'connection error:')); db.once('open', () => { console.log('connected'); });
che è proprio come è descritto nei documenti. E poi nei file del tuo modello, fai qualcosa di simile al seguente:
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;
Dove myDB è il nome del tuo database.