gpt4 book ai didi

node.js - 如何使 Mongoose 连接在全局范围内可用

转载 作者:IT老高 更新时间:2023-10-28 23:08:39 30 4
gpt4 key购买 nike

我正在使用 express 3.x 和 mongoose 3.6.4。

到目前为止,我一直在我的 express apps.js 文件中创建一个 Mongoose 连接,如下所示:

var mongoose = require('mongoose');
mongoose.connect('mongodb://127.0.0.1:27017/mytest');

然后我将我的模型分成单独的文件,如模型/用户,如下所示:

var mongoose = require("mongoose");
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId;

var userSchema = new Schema({
userId: ObjectId,
givenName:String ...
});

exports.User = mongoose.model('User', userSchema);

然后在多个路由文件中,我使用了这样的用户模型:

var User = require('./models/user').User;
User.findById(id, function(err, user){ ...

这对本地发展非常有效。所有模型共享相同的连接。

但现在我想使用 mongoose.createConnection() 并创建一个可以以类似方式使用的连接池。我想在应用程序启动时建立一个连接池并将该池用于所有模型。所以,我试过这个:

var conn = mongoose.createConnection("localhost","dpatest", 27017,{user:"???",pass:"???"});

但模型不会自动共享连接。因此,我尝试了各种方法,例如导出连接并尝试在模型中使用它。但除了为每个模型设置单独的连接之外,没有其他任何工作。

有人可以解释如何使用 mongoose.createConnection() 创建单个连接池吗?

这里是关于我的问题的更多信息:

/************ app.js *****************/
var http = require('http');
var path = require('path');
var express = require('express');
//these are my routing files
var auth = require('./src/auth');
var profile = require('./src/profile');
var admin = require('./src/admin');
var tx = require('./src/tx');
var system = require('./src/system');
var servicing = require('./src/servicing');

var dbUri;
var dbUser = "?????";
var dbPass = "?????";

//here are my configurations for development and production
app.configure('development', function(){
app.set('port', 3460);
app.use(express.errorHandler());
dbUri = "mongodb://mongodb://127.0.0.1:27017/dpatest";
});

app.configure('production', function(){
app.set('port', 3461);
dbName = 'dpa';
dbUri = "mongodb://"+dbUser+":"+dbPass+"@ds052525.mongolab.com:51437/dpa";
});

/*
this is what I was originally using for development
and want to change for deployment
*/
mongoose.connect(dbUri);

这就是我打算搬到的地方:

var conn = mongoose.createConnection(dbUri);

我的模型(5 个不同的模型)位于应用根目录下名为 src/models 的目录中。比如用户模型:

/************ user.js *************/
var mongoose = require("mongoose");
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId;
var userSchema = new Schema({
userId: ObjectId,
givenName: String, ...
});

导出如下:

exports.User = mongoose.model('User', userSchema);

然后,在各种路由文件中使用模型,如下所示:

/****************auth.js**************/
var User = require('./models/user').User;

exports.createAccount = function(req, res){
var user = new User({});
. . .
user.save(function(err, usr){

});
};

我正在寻找如何用 mongoose.createConnection 替换 mongoose.connect() 并让它跨多个模块工作的具体示例。 Sergey 的回答看起来很有希望,但我不明白如何在路由文件中引用模型。我试过了:

var User = require(../models).User

但无法让它工作。它不断抛出引用错误。

谢谢!

最佳答案

在你的模型文件夹中创建 index.js

例如

    module.exports = function (mongoose,  dbconn) {
return {

modelname: require("./file" )(mongoose, dbconn),
modelname2: require("./file2" )(mongoose, dbconn),
};
};

然后将其加载到您的主启动文件文件中,您可以在其中通过

创建数据库连接
var models    = require("./models")(mongoose,dbconn);

models 文件夹中的示例模型文件应如下所示:

module.exports = function (mongoose,  dbconn) {
/*
*
*/
var schema = new mongoose.Schema({
/**
* field
* @type String
*/
field: String......
});

return dbconn.model("modelname", schema, "collectioname");
};

等等……

关于node.js - 如何使 Mongoose 连接在全局范围内可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15957821/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com