需要一点理解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对象在使用时被完全构造??
答案 0 :(得分:0)
之前我曾经使用过C ++,Java(现在回来了,现在还没有),现在在nodejs工作。我想我理解你的问题。以下是一些要点。
是的,Nodejs模块有点类似于封装变量的类,只能通过公共方法访问(通过导出公开)。我想你知道这里根本没有类实现,但它松散地映射到行为。
nodejs的关键区别在于资源实例化的异步性质。通过这个,我的意思是如果有2个语句stmt1和stmt2,如果调用了stmt1并且需要时间,则nodejs不会等待它结束(这是同步行为),而是移动到stmt2。在pre-nodejs世界中,我们假设达到stmt2意味着stmt1已完成。
那么,解决方法是什么?如何确保在获得数据库连接后执行某些操作。如果您的代码没有立即进行db调用,您可以假设连接将通过。或者,如果您想立即调用db,则在回调上编写代码。 Mongo公开了名为“open”和“error”的事件。您可以使用它来确保连接打开。此外,最佳做法是跟踪错误事件。
db.on('error',console.error.bind(console,'connection error'));
db.once('open',function callback(){ console.log(“与数据库的连接成功。”); //把你的代码 });
我不知道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});
现在这应该适合你。