写了一个Controller层调用service但是调用的时候没有数据返回
发布于 10 年前 作者 SunilWang 10455 次浏览 最后一次编辑是 8 年前 来自 问答

Controller层:

router.get(’/toReg’,function(req,res){ sexInfoService.getAllSexInfo(function(err,sexInfoArr){ console.log(sexInfoArr.length); res.render(‘loginAndReg/reg’,{sexAll:sexInfoArr}); }); });

Service层 //获取所有性别的信息 sexInfoService.getAllSexInfo = function(callback){ var sexInfodb = mongodb.collection(‘sexInfo’); sexInfodb.find({},function(err,data){ if(err){ return callback(err); } var sexInfoArr = []; data.each(function(err,doc){ sexInfoArr.push(doc); }); return callback(err,sexInfoArr); }); }

module.exports = sexInfoService;

根据断点确实调用 sexInfoArr.push(doc); 了,但是 sexInfodb.find方法变成异步的了。 也就是说先经过Controller层toReg get方法,然后在进入Service层sexInfoService.getAllSexInfo的方法,但是经过sexInfodb.find的时候感觉直接略过,然后回到Controller层toReg sexInfoService.getAllSexInfo方法所以console.log(sexInfoArr.length) 时没有数据显示,这时候才开始触发Service层里的sexInfodb.find方法呢? 我这样写有什么问题吗?

5 回复

我连接的数据库对象是这样的。 var mongodb = require(‘mongodb’); var log4js = require(’./…/app’).logger(‘fileAppenderError’); var Db = mongodb.Db; var Server = mongodb.Server; var dbConfig = require(’…/config/config’).dbConfig; var globalDb = new Db(dbConfig.dbName, new Server(dbConfig.dbPath, dbConfig.dbPort), {auto_reconnect: true});

//全局打开一个连接 globalDb.open(function (err) { if (err) { log4js.error(err.stack); throw err; } }); //导出模块 module.exports = { db: globalDb };

就是全局就只有一个打开的mongodb连接

sexInfoService.getAllSexInfo = function(callback){
var sexInfodb = mongodb.collection(‘sexInfo’);
sexInfodb.find().toArray(function(err,results){
if(err){
return callback(err);
}
 return callback(err,results);
});
}

module.exports = sexInfoService;

@eeandrew 真是完美解决我的问题。 不过很想知道 sexInfodb.find() 与sexInfodb.find().toArray 有什么区别吗?

@KingTree 哈哈 这个嘛 你认真看看文档就知道了。NodeJS异步的坑以后还多着呢。

回到顶部