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

Mongoose connection automatically shared in Express.js application

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

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。

现在是问题:我注意到在server.js中编译的每个模型和与数据库的连接在我使用的每个中间件中都可用,只需要mongoose 模块"... "它为什么起作用?"

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

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

我认为这是一件好事,但我不知道它为什么起作用。 我的意思是......我已经阅读了大量关于获得此结果的最佳方法的问题和答案,但我从未读过这种方法。

我也阅读了有关 Express.js 的文档......但什么都没有。

是否与Express的缓存系统有关?

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

提前致谢,

卢卡

因为 server.js 是您应用程序的主要入口点,所以这是节点看到所需 mongoose 模块的第一个地方。

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

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

这是由于 CommonJS 模块在整个应用程序中的缓存方式所致。

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