我用的数据库是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. 第二:如果我的思路是错的,哪有没有其他正确的方法
- 把数据库常连接放在接口
function login (req, res, connect) {...}
或者
function login (connect) {
return function (req, res) {...}
}
- 把数据库模块设为单例,并在第一次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