2017-08-07 62 views
0

我有一个Node/Express应用程序,它使用Mongoose与MongoDB数据库对话。 Express服务器配置在一个名为server.js的文件中,模式位于单独的models.js文件中。下列每一个项目和教程到目前为止,我所看到的,我有mongoose.connect()在这两个地方配置:为什么我们在Express服务器文件中导入Mongoose?

// 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进口猫鼬,我可以不要在server.js中完全跳过,只需在模型脚本本身中设置连接?当我只在处理模式时使用它时,将其导入并配置连接以及服务器配置的其余部分有什么意义?如果答案是肯定的,为什么没有人这样做?在这里玩是否有性能优势?

回答

1

你可以在模型脚本中做mongoose.connect(),但这不是明智的。

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

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

您必须在每个模型中执行连接才能确定,但​​这是一个糟糕的设计和不必要的代码重复。

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

-2

为了解决您的问题,首先您需要了解面向对象的编程。现在,你有两个不同的文件。一个如果server.js。另一个是models.js。每个文件都有自己的范围。

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

// server.js 
const foo = 'bar'; 

如果你想只使用一个单一脚本导入和共享他人猫鼬,你可以从Node.js的ENV使用全局对象。查看网址以了解更多信息。 node.js global variables?

但是,我并没有真正推荐将猫鼬服务放在gloabl对象中。全局范围一开始可能很简单,但随着您的应用程序在以后的时间内越来越大,它可能会成为可扩展性问题。

谢谢。

+0

OOP中的这一课,我认为我已经做了多年,现在没有回答这个问题。在问题中很明显,我没有在server.js中的任何地方使用db或其连接。我调用它的唯一时间是使用模式,并且我已经在models.js文件中使用了连接语句和mongoose导入。这就是为什么我问为什么我们需要猫鼬或它在server.js中的设置。 – TheLearner

+0

我对你有另一个惊喜。您还必须在路线文件中导入猫鼬。 – JavaEvgen

1

您不需要requireserver.js文件中的猫鼬。实际上,在我的项目中,我为每个连接创建了一个单独的文件,如connection_one.js,connection_two.jsexportmongoose对象。这样,当任何数量的models做一个require("./connection_one.js")它将返回相同的连接准备mongoose导出它的所有模型。这可能是由于模块在项目中首次加载时被缓存。在server.js中加载mongoose模块时,server.jsmodel.js中的对象也是相同的mongoose

相关问题