我曾在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我的猜测是数据库是无法初始化在第一行本身。 –