Node.js 为什么要在Express server文件中导入Mongoose?

Node.js 为什么要在Express server文件中导入Mongoose?,node.js,express,mongoose,Node.js,Express,Mongoose,我有一个Node/Express应用程序,它使用Mongoose与MongoDB数据库对话。Express服务器在一个名为server.js的文件中配置,模式在一个单独的models.js文件中。在我看过的每个项目和教程之后,我在两个地方都配置了mongoose.connect() // server.js const express = require('express'); const cookieParser = require('cookie-parser'); const bodyPa

我有一个Node/Express应用程序,它使用Mongoose与MongoDB数据库对话。Express服务器在一个名为server.js的文件中配置,模式在一个单独的models.js文件中。在我看过的每个项目和教程之后,我在两个地方都配置了mongoose.connect()

// server.js
const express = require('express');
const cookieParser = require('cookie-parser');
const bodyParser = require('body-parser');
const mongoose = require('mongoose');

const app = express();
mongoose.connect('mongodb://127.0.0.1/mydb');

// models.js
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const User = new Schema({
  username: String,
  password: { type: String, select: false },
  name: String,
});
module.exports = mongoose.model('User', User);

我的问题是,既然我已经在models.js中导入了mongoose,我能不能完全跳过在server.js中的导入,而只在模型脚本本身中设置连接?当我只打算在使用模式时使用它时,导入它并配置连接以及服务器配置的其余部分有什么意义?如果答案是肯定的,为什么没有人这样做?这里有性能优势吗?

要解决您的问题,首先您需要了解面向对象编程。现在,您有两个不同的文件。一个if server.js。另一个是models.js。每个文件都有自己的作用域

即使您在server.js中导入了mongoose,因为这两个作用域具有不同的作用域集,models.js也无法使用在server.js中导入的mongoose服务。例如,假设您定义了一个变量“foo”, 您不能在model.js中使用该变量,因为它们的作用域是隔离的

// server.js
const foo = 'bar';
如果只想使用在单个脚本中导入并由其他人共享的一个mongoose,可以使用Node.js env中的全局对象。请查看url以了解更多关于此的信息。

然而,我并不建议将mongoose服务放在gloabl对象中。全局范围在一开始可能很容易,但随着应用程序在以后的时间里变得越来越大,它可能是一个重大的可伸缩性问题


谢谢。

要回答您的问题,首先您需要了解面向对象编程。现在,您有两个不同的文件。一个if server.js。另一个是models.js。每个文件都有自己的作用域

即使您在server.js中导入了mongoose,因为这两个作用域具有不同的作用域集,models.js也无法使用在server.js中导入的mongoose服务。例如,假设您定义了一个变量“foo”, 您不能在model.js中使用该变量,因为它们的作用域是隔离的

// server.js
const foo = 'bar';
如果只想使用在单个脚本中导入并由其他人共享的一个mongoose,可以使用Node.js env中的全局对象。请查看url以了解更多关于此的信息。

然而,我并不建议将mongoose服务放在gloabl对象中。全局范围在一开始可能很容易,但随着应用程序在以后的时间里变得越来越大,它可能是一个重大的可伸缩性问题


谢谢。

您可以在模型脚本中执行mongoose.connect(),但这是不可取的

您必须确保在加载任何其他需要mongoose连接的脚本之前加载此模型

如果您继续在应用程序中创建另一个模型,那么这将取决于您的用户模型(model.js)是否已首先加载

您必须在每个模型中执行连接以确保安全,但这将是一个糟糕的设计和不必要的代码复制


因此,在server.js中连接是确保尽早建立连接的最佳方法。

您可以在模型脚本中执行mongoose.connect(),但这是不可取的

您必须确保在加载任何其他需要mongoose连接的脚本之前加载此模型

如果您继续在应用程序中创建另一个模型,那么这将取决于您的用户模型(model.js)是否已首先加载

您必须在每个模型中执行连接以确保安全,但这将是一个糟糕的设计和不必要的代码复制


因此,在server.js中连接是确保尽早建立连接的最佳方法。

您无需
要求
server.js
文件中的猫鼬。事实上,在我的项目中,我为每个连接创建了一个单独的文件,比如
connection\u one.js
connection\u two.js
export
mongoose
对象。这样,当任何数量的
模型
需要(“./connection\u one.js”)时,它将为导出它的所有模型返回相同的连接就绪
mongoose
。这是可能的,因为模块是在项目中第一次加载时缓存的。这也是当您在
server.js
中加载
mongoose
模块时发生的情况,它与
server.js
model.js
中的
mongoose
对象是相同的。事实上,在我的项目中,我为每个连接创建了一个单独的文件,比如
connection\u one.js
connection\u two.js
export
mongoose对象。这样,当任何数量的
模型
需要(“./connection\u one.js”)时,它将为导出它的所有模型返回相同的连接就绪
mongoose
。这是可能的,因为模块是在项目中第一次加载时缓存的。这也是当你在
server.js
中加载
mongoose
模块时所发生的事情,它与
server.js
model.js
中的
mongoose
对象是相同的
。问题中很明显,我没有在server.js中的任何地方使用db或其连接。我唯一一次调用它是在使用模式时,我已经在models.js文件中有了mongoose导入和connection语句。这就是为什么我问为什么我们需要mongoose或它在server.js中的设置。我还有一个惊喜要给你。您还必须在路由文件中导入mongoose