我正在使用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上共享数据库连接是否安全?
提前致谢,
卢卡
答案 0 :(得分:7)
由于server.js
是应用程序的主要入口点,因此节点首先需要mongoose
模块。
mongoose
模块实例的任何更新都会反映在该特定实例中。
例如,如果您的mongoose
文件和server.js
模型文件中需要user.js
,则只会对同一mongoose
对象进行更改。
这是因为CommonJS模块在整个应用程序中的缓存方式。
如果您想了解有关模块缓存方式的更多信息,我建议使用以下两个来源: