2017-02-27 189 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}); 

现在,这应该为你工作。