我曾在C++,Java之前(有時回來,現在不是現在),現在在nodejs中工作。我想我理解你的問題。這裏有一些要點。
是的,Nodejs模塊有點像類,他們封裝變量,你只能通過公共方法(通過出口公開)訪問。我認爲你知道這裏沒有任何類實現,但它鬆散地映射到行爲。
nodejs的主要區別是資源實例化的異步性質。通過這個,我的意思是如果有兩個語句stmt1和stmt2,如果stmt1被調用並且需要時間,那麼nodejs不會等待它結束(這是同步行爲),而是移動到stmt2。在pre-nodejs世界中,我們假設達到stmt2意味着stmt1已完成。
那麼,什麼是解決方法?如何確保在獲得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?
你爲什麼認爲DB是未初始化的? –
在調試器中看到了這個,它是空的。無論如何,我寧願組織一個回調代碼,以保證完成初始化 – amigo421
其不可能的數據庫是未初始化的,因爲db是一個關閉變量。 http://stackoverflow.com/questions/111102/how-do-javascript-closures-work我的猜測是數據庫是無法初始化在第一行本身。 –