許多人問:在Nodejs中如何共享Mongoose創建一個數據庫鏈接,而後在此應用程序其它地方都使用這個數據庫鏈接?node
許多國外的帖子對此進行了討論,可是國內相對沉悶,技術的流行程度和對技術的熱衷度也可見一斑。mongodb
Anyway....回到主題數據庫
下面這個例子告訴你們如何實現創建一個數據庫鏈接以後在程序的其它地方都使用它。express
例子基於Express, 按照如下步驟生成Express的目錄結構並安裝必要的包npm
1. npm install -g express-generator瀏覽器
2. md mytest && cd mytest (創建一個目錄,並進入目錄)app
3. express -e (生成網站的目錄結構,-e 表示用ejs 做爲模板,默認模板是jade)mongoose
4. npm install -d (安裝依賴項)編輯器
5. npm install mongoose測試
基於Express作這個例子的緣由是我想用Express中的路由,僅此而已
順便提一句,你們都用什麼編輯器寫Nodejs代碼?我用Sublime Text 2, 很好用。
在這個例子裏,咱們往數據庫中插入新公司(company集合)和新國家(country集合)咱們會創建一個Mongoose的數據庫鏈接,而後在任何地方都用它。
咱們把代碼用文件夾歸類,首先在mytest目錄下建util目錄,在util目錄下建schema目錄和dal目錄,schema目錄用來存放定義的schema,dal目錄用來存放最終寫數據庫的代碼
建好以後的目錄結構以下圖:
而後在dal目錄下建db.js文件,在db.js中會創建到數據庫的鏈接,代碼以下:
var mongoose=require('mongoose'); console.log('Creating global mongoose connection...'); // Build the connection string var dbURI = 'mongodb://localhost:27017/mytest'; // Create the database connection mongoose.connect(dbURI); // CONNECTION EVENTS // When successfully connected mongoose.connection.on('connected', function () { console.log('Mongoose default connection open to ' + dbURI); }); // If the connection throws an error mongoose.connection.on('error',function (err) { console.log('Mongoose default connection error: ' + err); }); // When the connection is disconnected mongoose.connection.on('disconnected', function () { console.log('Mongoose default connection disconnected'); }); // If the Node process ends, close the Mongoose connection process.on('SIGINT', function() { mongoose.connection.close(function () { console.log('Mongoose default connection disconnected through app termination'); process.exit(0); }); }); module.exports=mongoose;
注意最後一句,這裏將mongoose對象做爲此模塊的輸出,以便在其它地方使用它。
下面咱們來定義schema,這裏就會用到db.js。
先定義company的schema,代碼以下:
var mongoose=require('../dal/db.js'); var Schema=mongoose.Schema; var companySchema=new Schema({ Name:String }); module.exports=mongoose.model('Company',companySchema);
而後定義country的schema,代碼以下:
var mongoose=require('../dal/db.js'); var Schema=mongoose.Schema; var countrySchema=new Schema({ Name:String }); module.exports=mongoose.model('Country',countrySchema);
注意,以上兩個模塊的輸出是model對象。
如今來寫插入數據庫的代碼。
在dal文件夾中,新建companyDAL.js文件,代碼以下:
var Company=require('../schema/company.js'); exports.create=function(data,callback){ var company=new Company({ Name:data.name }); company.save(function(err,company){ if(!err){ callback(null,company); } else{ callback(err,null); } }); };
在dal文件夾中,新建countryDAL.js文件,代碼以下:
var Country=require('../schema/country.js'); exports.create=function(data,callback){ var country=new Country({ Name:data.name }); country.save(function(err,country){ if(!err){ callback(null,country); } else{ callback(err,null); } }); };
好了,如今是測試插入數據的時候了,方便起見,咱們定義兩個路由:
一個路由在GET /company的時候插入一條數據到company集合
一個路由在GET /country的時候插入一條數據到country集合
在routes目錄下,新建company.js文件,代碼以下:
var express = require('express'); var router = express.Router(); var companyDAL=require('../util/dal/companyDAL'); router.get('/', function(req, res) { companyDAL.create({"name":"My Company"},function(err,result){ if(!err){ res.send(JSON.stringify(result)); } else{ res.send(err); } }); }); module.exports = router;
在routes目錄下,新建country.js文件,代碼以下:
var express = require('express'); var router = express.Router(); var countryDAL=require('../util/dal/countryDAL'); router.get('/', function(req, res) { countryDAL.create({"name":"My Country"},function(err,result){ if(!err){ res.send(JSON.stringify(result)); } else{ res.send(err); } }); }); module.exports = router;
而後回到app.js文件添加這兩個路由:
var routes = require('./routes/index'); var users = require('./routes/users'); var company=require('./routes/company'); var country=require('./routes/country'); ............................... app.use('/', routes); app.use('/users', users); app.use('/company',company); app.use('/country',country);
最終的文件目錄結構以下圖:
如今咱們來測試一下:
在命令行裏輸入:node bin/www,能夠看到下圖
提示信息來自db.js,至此代表數據庫已經鏈接成功(請各位看官記得先用mongod啓動數據庫)
用瀏覽器訪問 http://http://localhost:3000/company
用瀏覽器訪問 http://localhost:3000/country
能夠看到以下的輸出:
代表數據插入成功。
下面總結一下:
1. 從代碼以及結果可見,在往company和country數據集插入數據的時候,都是使用的db.js中定義mongoose對象
2. db.js 在 node bin/www啓動應用程序的時候就被執行,爲何會被執行?
由於app.js中定義了路由並做爲中間件使用
var company=require('./routes/company'); var country=require('./routes/country'); ...................... app.use('/company',company); app.use('/country',country);
而後又在路由文件(routes/company.js, routes/country.sj)中引用了數據訪問層的代碼
var companyDAL=require('../util/dal/companyDAL'); var countryDAL=require('../util/dal/countryDAL');
在companyDAL.js和countryDAL中又引用了schema的代碼
var Company=require('../schema/company.js'); var Country=require('../schema/country.js');
在schema代碼中引用了db.js
var mongoose=require('../dal/db.js');
因此在程序啓動的時候db.js被調用,而且,db.js不管被引用了多少次,只會被調用一次,這是require機制決定的。
所以實現Mongoose全局數據庫鏈接的原理是在程序啓動的時候咱們就定義好數據庫鏈接,並打開數據庫鏈接,並把此mongoose對象做爲模塊的導出,其它須要使用數據庫鏈接的時候,直接require這個模塊就能夠了