2017-08-07 66 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

相關問題