问一个node+mongodb的问题
发布于 10 年前 作者 hc2014 4334 次浏览 最后一次编辑是 8 年前

我用的数据库是Mongodb,然后连接的模块是是mongodb. package.json 里面配置的是,“mongodb”:"*" 我在根目录下建立了一个conDB.js的文件是想用来连接到mongodb数据库,具体代码如下: var mongodb = require(‘mongodb’); var server = new mongodb.Server(‘localhost’,27017,{auto_reconnect:true}); module.exports = server;

然后再一个user.js的文件: var server = require(’…/conDB’); var mongodb = require(‘mongodb’); var db = new mongodb.Db(‘user’,server,{safe:true});

exports.login=function (req,res,next) { db.open(function(err,db){ if(!err) {
db.collection(‘user’, function(err, collection){ collection.count({“username”:req.body.username,“pwd”:req.body.pwd},function(err,count){ if(count==1){ res.json(“ok”); } else{ res.json(“err”); } }) }); }else{ res.json(“err”); } }); };

当我第一次登陆以后一切正常,如果这个时候我改url ,到登陆页面的时候,我再一次输入账号密码来登陆系统,这个时候问题就出来了,提示错误信息是:Error: db object already connecting, open cannot be called multiple times 这个意思大概是说我已经有打开的链接了吧。我现在的问题是 第一:如果按我这个思路来做,应该怎么来处理这样的问题?我自己在conDB.js里面用过server.connected这个来查看链接状态 结果永远都是false. 第二:如果我的思路是错的,哪有没有其他正确的方法

7 回复
  1. 把数据库常连接放在接口 function login (req, res, connect) {...} 或者
    function login (connect) {
        return function (req, res) {...}
    }
  1. 把数据库模块设为单例,并在第一次require的时候,初始化配置 该文件可以这样写:
    var connect = ... 你的连接

    function a () { connect... }
    function b () { connect... }
     ...

so, 当require该文件,通过cache只需要一次连接。

@tulayang 你说的道理我懂,可是具体要怎样实现呢? 我把都关于这个问题的一些代码整理出来 首先是根目录下的server.js 这个是项目启动 server.js 跟这个问题有关系的代码是 var user = require(’./routes/user’); app.post(’/views/login.html’,user.login); 然后就是同意是根目录下的一个conDB.js的文件 全部代码如下: var mongodb = require(‘mongodb’); var server = new mongodb.Server(‘localhost’,27017,{auto_reconnect:true}); module.exports = server; 最后就是user.js var server = require(’…/conDB’); var mongodb = require(‘mongodb’); var db = new mongodb.Db(‘user’,server,{safe:true});

exports.login=function (req,res,next) { db.open(function(err,db){ if(!err) {
db.collection(‘user’, function(err, collection){ collection.count({“username”:req.body.username,“pwd”:req.body.pwd},function(err,count){ if(count==1){ res.json(“ok”); } else{ res.json(“err”); } }) }); }else{ res.json(“err”); } }); };

你能否把实现的思路说的再详细一点?

我自己搞定了,就加了一个判断代码如下: exports.login=function (req,res,next) { if(server._serverState==“connected”) { db.close(); } db.open(function(err,db){ if(!err) {
db.collection(‘user’, function(err, collection){ collection.count({“username”:req.body.username,“pwd”:req.body.pwd},function(err,count){ if(count==1){ res.json(“ok”); return; } else{ res.json(“err”); } }) }); }else{ db.close(); res.json(“err”); } }); }; 在db.open 之前判断一下。 虽然问题解决了,但是总感觉这样写不对劲,还请各位 写过这方面代码的同学贴点代码出来

不必要每次开,每次关。 一直连接着就好了。

@SoftICE 一直开着会报错,:Error: db object already connecting, open cannot be called multiple times,你能提供个小例子吗?

@SoftICE 我的代码都贴出来了,或者你要是能贴一下访问mongodb的代码 那更好啦

//读取用户信息 User.get = function(name, callback) { //打开数据库 mongodb.open(function (err, db) { if (err) { return callback(err);//错误,返回 err 信息 } //读取 users 集合 db.collection(‘users’, function (err, collection) { if (err) { mongodb.close(); return callback(err);//错误,返回 err 信息 } //查找用户名(name键)值为 name 一个文档 collection.findOne({ name: name }, function (err, user) { mongodb.close(); if (err) { return callback(err);//失败!返回 err 信息 } callback(null, user);//成功!返回查询的用户信息 }); }); }); }; 这是我的用户的一个方法,呵呵, 我的一个简单的博客,求支持下,谢啦 http://blog.gaoqixhb.com

回到顶部