2017-02-27 180 views
0

需要一個理解nodejs代碼組織的一點幫助, 所以我來自C++世界,並假設不理解原則。nodejs模塊代碼執行

所以我需要實現一些js模塊,它應該連接到MongoDB併爲其他模塊導出一些方法:例如插入,更新,刪除。

,當我寫的東西,如:

var db = MongoClient.connect(config.connectionString, {native_parser:true},function (err, db) {...}); 

exports.insert = function(a, b) { 
    // db using 
    //... 
}; 

我想,「DB」局部靜態變量,並在任何情況下被初始化。在調用「require('this module')」的時候,但看起來不是這樣,並且db在調用導出函數時未初始化?另一個問題 - 我想這應該使用「期貨」(C++的類,沒有從js中找到類似物)來實現,以保證db對象在使用時完全構建。

+0

你爲什麼認爲DB是未初始化的? –

+0

在調試器中看到了這個,它是空的。無論如何,我寧願組織一個回調代碼,以保證完成初始化 – amigo421

+0

其不可能的數據庫是未初始化的,因爲db是一個關閉變量。 http://stackoverflow.com/questions/111102/how-do-javascript-closures-work我的猜測是數據庫是無法初始化在第一行本身。 –

回答

0

我曾在C++,Java之前(有時回來,現在不是現在),現在在nodejs中工作。我想我理解你的問題。這裏有一些要點。

  1. 是的,Nodejs模塊有點像類,他們封裝變量,你只能通過公共方法(通過出口公開)訪問。我認爲你知道這裏沒有任何類實現,但它鬆散地映射到行爲。

  2. nodejs的主要區別是資源實例化的異步性質。通過這個,我的意思是如果有兩個語句stmt1和stmt2,如果stmt1被調用並且需要時間,那麼nodejs不會等待它結束(這是同步行爲),而是移動到stmt2。在pre-nodejs世界中,我們假設達到stmt2意味着stmt1已完成。

  3. 那麼,什麼是解決方法?如何確保在獲得db連接後執行某些操作。如果你的代碼沒有立即進行數據庫調用,你可以假設連接將通過。或者,如果您立即想要調用db,則可以在回調中編寫代碼。 Mongo公開了稱爲「開放」和「錯誤」的事件。您可以使用它來確保連接已打開。追蹤錯誤事件也是最好的做法。 ('error',console.error.bind(console,'connection error'));

    db.once( '開放',回調函數(){ 的console.log( 「與數據庫連接成功。」); // 把你的代碼 });

我不知道C++的未來,所以不能評論。

希望這會有所幫助!

[更新]要添加例如

你可以有db.js用於建立數據庫連接和揭露貓鼬對象創建模型。

'use strict'; 

var Mongoose = require('mongoose'), 
     Config = require('./config'); 

Mongoose.connect(Config.database.url); 

var db = Mongoose.connection; 

db.on('error', console.error.bind(console, 'connection error')); 

db.once('open', function callback() { 
    console.log("Connection with database succeeded."); 
}); 

exports.Mongoose = Mongoose; 
exports.db = db; 

可以包括在server.js db.js像

var DB = require('db.js'); 

將做初始化。

然後,您可以使用貓鼬(mongoose是一個對象關係映射器與mongo一起使用並強烈推薦)來獲取數據庫對象的模型,如下所示。

//userModel.js 

var mongoose = require('mongoose'), 
    Schema = mongoose.Schema, 

var UserSchema = new Schema({ 
    uid : {type : Number, required: false} 
    , email : {type : String, get: toLower, set: toLower, required: true, index: { unique: true } } 
    , passwd : {type : String, required: false} 
); 

var user = mongoose.model('user', UserSchema); 

module.exports = { 
    User : user 
}; 

有關貓鼬的更多信息,你可以參考http://mongoosejs.com

的分貝我在網絡環境中使用,一般不關閉,始終打開。有db連接池維護和連接重用最佳。我看到注意到SO中的一個線程,它增加了更多細節。 Why is it recommended not to close a MongoDB connection anywhere in Node.js code?

+0

謝謝。你能用一個例子來擴展你的文章嗎?因爲目前,如果我在方法之外初始化數據庫,它的空缺。在方法裏面 - 工作正常。 - 是的,我不需要在連接後立即使用db – amigo421

+0

當然,現在將添加。 –

+0

謝謝!順便說一句 - 你能否描述 - 釋放資源的最佳實踐是什麼?我的意思是在哪裏以及如何在我的情況下db.close()? – amigo421

0

所以我看到的問題是,你想使用數據庫,但由於DB是異步返回,它可能會或可能不會在導出的函數中可用,因此您需要將連接從異步轉換爲同步。

由於MongoDB驅動程序不能同步,我建議你使用包裝,我建議mongoskin。

https://github.com/kissjs/node-mongoskin

var mongo = require('mongoskin'); 
var db = mongo.db(config.connectionString, {native_parser:true}); 

現在,這應該爲你工作。