단일 node.js 프로젝트의 Mongoose 및 다중 데이터베이스
하위 프로젝트를 포함하는 Node.js 프로젝트를 수행하고 있습니다.1개의 서브프로젝트는 1개의 Mongodb 데이터베이스를 가지며 Mongoose는 db의 래핑과 쿼리에 사용됩니다.근데 문제는
- Mongoose는 모델이 하나의 연결 위에 구축되므로 단일 Mongoose 인스턴스에서 여러 데이터베이스를 사용할 수 없습니다.
여러 mongoose 인스턴스를 사용하는 경우 Node.js에는 캐싱 시스템이 있기 때문에 여러 모듈인스턴스가 허용되지 않습니다.
require()
Node.js에서 모듈 캐싱을 비활성화하는 것은 알고 있지만 mongoose에서만 필요하기 때문에 좋은 솔루션은 아니라고 생각합니다.사용하려고 했습니다.
createConnection()
그리고.openSet()
하지만 그건 해결책이 아니었어요mongoose 인스턴스(http://blog.imaginea.com/deep-copy-in-javascript/)를 상세 복사하여 서브프로젝트에 새로운 mongoose 인스턴스를 전달하려고 했지만, mongoose 인스턴스가 느려졌습니다.
RangeError: Maximum call stack size exceeded
.
이 문제에 대해 mongoose와 함께 여러 데이터베이스를 사용할 수 있는 방법이 있는지 알고 싶습니다.왜냐하면 나는 몽구스가 꽤 쉽고 빠르다고 생각하기 때문이다.또는 권장되는 다른 모듈이 있습니까?
벌금 설명서에 따르면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를 요구합니다.프로젝트 루트 또는 글로벌이 아닙니다.서브프로젝트 1개, mongoose 설치 1개, mongoose 인스턴스 1개입니다.
-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;
in 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()를 호출하고 각 인스턴스에서 생성되는 풀 크기를 제한하십시오.
단일 node.js 프로젝트의 Mongoose 및 다중 데이터베이스
useDb를 사용하여 이 문제를 해결합니다.
예
//product databse
const myDB = mongoose.connection.useDb('product');
module.exports = myDB.model("Snack", snackSchema);
//user databse
const myDB = mongoose.connection.useDb('user');
module.exports = myDB.model("User", userSchema);
적어도 내게는 최적화된 솔루션.이것을 db.db.dll 파일에 기입하고, 필요에 따라서 이것을 요구해, 함수 호출로 호출하면, 조작할 수 있습니다.
const MongoClient = require('mongodb').MongoClient;
async function getConnections(url,db){
return new Promise((resolve,reject)=>{
MongoClient.connect(url, { useUnifiedTopology: true },function(err, client) {
if(err) { console.error(err)
resolve(false);
}
else{
resolve(client.db(db));
}
})
});
}
module.exports = async function(){
let dbs = [];
dbs['db1'] = await getConnections('mongodb://localhost:27017/','db1');
dbs['db2'] = await getConnections('mongodb://localhost:27017/','db2');
return dbs;
};
저는 이 방법을 사용해 왔고, 지금까지도 매우 효과가 있습니다.
const mongoose = require('mongoose');
function makeNewConnection(uri) {
const db = mongoose.createConnection(uri, {
useNewUrlParser: true,
useUnifiedTopology: true
});
db.on('error', function (error) {
console.log(`MongoDB :: connection ${this.name} ${JSON.stringify(error)}`);
db.close().catch(() => console.log(`MongoDB :: failed to close connection ${this.name}`));
});
db.on('connected', function () {
mongoose.set('debug', function (col, method, query, doc) {
console.log(`MongoDB :: ${this.conn.name} ${col}.${method}(${JSON.stringify(query)},${JSON.stringify(doc)})`);
});
console.log(`MongoDB :: connected ${this.name}`);
});
db.on('disconnected', function () {
console.log(`MongoDB :: disconnected ${this.name}`);
});
return db;
}
// Use
const db1 = makeNewConnection(MONGO_URI_DB1);
const db2 = makeNewConnection(MONGO_URI_DB2);
module.exports = {
db1,
db2
}
언급URL : https://stackoverflow.com/questions/19474712/mongoose-and-multiple-database-in-single-node-js-project
'bestsource' 카테고리의 다른 글
node.database (0) | 2023.02.28 |
---|---|
Woocomme 주문 업데이트 웹 후크가 실행되지 않음 (0) | 2023.02.28 |
ASP를 사용하여 jQuery AJAX 콜에서 "에러" 콜백을 트리거하려면 어떻게 해야 합니까?NET MVC? (0) | 2023.02.28 |
React TypeScript 16.8 useEffect() 비동기화 방법 (0) | 2023.02.28 |
반응 의존성 주입 또는 유사합니까? (0) | 2023.02.28 |