nodejs模块代码执行

时间:2017-02-27 10:39:08

标签: javascript node.js mongodb

需要一点理解nodejs代码组织的帮助, 所以我来自C ++世界,并认为没有理解原则。

所以我需要实现一些js模块,它应该连接到MongoDB并为其他模块导出一些方法:例如插入,更新,删除。

当我写下这样的内容时:

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

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

我认为" db"本地静态变量,无论如何都会被初始化。在通话时#34;要求('此模块')"但似乎不是这样,db在导出函数调用时未初始化?另一个问题 - 我想这应该用"期货"来实现。 (来自c ++的类,没有找到js的类似物)来保证db对象在使用时被完全构造??

2 个答案:

答案 0 :(得分:0)

之前我曾经使用过C ++,Java(现在回来了,现在还没有),现在在nodejs工作。我想我理解你的问题。以下是一些要点。

  1. 是的,Nodejs模块有点类似于封装变量的类,只能通过公共方法访问(通过导出公开)。我想你知道这里根本没有类实现,但它松散地映射到行为。

  2. nodejs的关键区别在于资源实例化的异步性质。通过这个,我的意思是如果有2个语句stmt1和stmt2,如果调用了stmt1并且需要时间,则nodejs不会等待它结束(这是同步行为),而是移动到stmt2。在pre-nodejs世界中,我们假设达到stmt2意味着stmt1已完成。

  3. 那么,解决方法是什么?如何确保在获得数据库连接后执行某些操作。如果您的代码没有立即进行db调用,您可以假设连接将通过。或者,如果您想立即调用db,则在回调上编写代码。 Mongo公开了名为“open”和“error”的事件。您可以使用它来确保连接打开。此外,最佳做法是跟踪错误事件。

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

    db.once('open',function callback(){     console.log(“与数据库的连接成功。”);     //把你的代码 });

  4. 我不知道C ++的未来,因此无法对此发表评论。

    希望这有帮助!

    [更新]添加示例

    您可以使用db.js来设置数据库连接并公开Mongoose对象以创建模型。

    '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(mongoose是一个Object关系映射器来处理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?

答案 1 :(得分:0)

所以我看到的问题是你想使用DB,但由于DB是异步返回的,它可能在导出的函数中可用,也可能不在,因此你需要将连接从异步转换为同步。

由于MongoDB驱动程序无法进行同步,我建议您使用包装器,我建议使用mongoskin。

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

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

现在这应该适合你。