Mongoose连接在Express.js应用程序中自动共享

时间:2015-03-10 14:51:49

标签: javascript node.js mongodb express mongoose

我正在使用Express.js和Mongodb(以及用于使用Schemas访问数据库的mongoose模块)开发RESTful API。 我一直在寻找在整个Express应用程序中共享Mongo数据库连接的最佳方式,以便不为每个请求建立新的连接(Web建议和Stackoverflow上的其他答案)。 我已经阅读了不同的解决方案,我决定尝试使用这种架构:

server.js (主应用程序文件)中我有这样的内容:

var express = require("express");
var bodyParser = require("body-parser");
var logger =  require("morgan");
var configuration = require("./configuration.js");
var fs = require("fs");
var HTTPresponses = require("./responses.js"); 
var mongoose = require("mongoose");

require("./models/user_model.js");

var Users = mongoose.model("Users");

//Connect to Db 
mongoose.connect("mongodb://127.0.0.1/test");

//Rest of the code here

正如您所看到的,我使用mongoose创建了一个与数据库的新连接,然后我需要user_module,如下所示:

var UserSchema = new Schema({
    name : {type: String},
    surname : {type: String},
    username : {type: String, unique: true, required: true}     
    }

,{
    collection : "Users"
});

mongoose.model("Users", UserSchema);

这样,UserSchema直接在mongoose对象中编译。

现在是问题:我注意到在server.js中编译的每个模型以及与db的连接在我使用的每个中间件中都可用,只需要mongoose模块“...” 为什么会有效?

所以...如果我有一个需要访问数据库的中间件,我唯一需要做的就是需要moongose模块和我只需要调用的retreive模型:

var MY_MODEL = mongoose.model("NAME_OF_THE_MODEL_COMPILED_in_serve.js");

我认为这是一件好事,但我不知道它为什么会起作用。 我的意思是......我已经阅读了很多问题和答案,讨论了获得这个结果的最佳方法,但我从未读过这种方式。

我还阅读了有关Express.js的文档......但没有。

它可能与Express的缓存系统有关吗?

在Express App上共享数据库连接是否安全?

提前致谢,

卢卡

1 个答案:

答案 0 :(得分:7)

由于server.js是应用程序的主要入口点,因此节点首先需要mongoose模块。

mongoose模块实例的任何更新都会反映在该特定实例中。

例如,如果您的mongoose文件和server.js模型文件中需要user.js,则只会对同一mongoose对象进行更改。

这是因为CommonJS模块在整个应用程序中的缓存方式。

如果您想了解有关模块缓存方式的更多信息,我建议使用以下两个来源: