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