我需要将find()的查询结果暴露给其他页面,但是find()查询操作是异步的,该如何实现呢?
var settings = require ("./settings"); var mongoose = require('mongoose'); var db = mongoose.connection; var Schema = mongoose.Schema; mongoose.connect('mongodb://'+settings.host+'/'+settings.db); var articleSchema = new Schema({ title : String, author : Array, aclTitle : Array, creation : Array, brife : Array }); var articleModel = mongoose.model('articles',articleSchema); var articleEntity = new articleModel({}); db.on('error',function(){ console.log("连接出现错误") }); db.once('open',function () { console.log("连接成功!") }); articleModel.find(function(e,d) { module.exports = d;//我这里想把查询结果exports出去,另一个页面require进来 }) //但是因为是异步的,写在回调里,别的页面require进去是空对象, //写在回调外面,那就取不到这个查询结果
代码参考这里其实你想要的地方能够得到查询出来的结果。比如,现在有一个页面需要“宠物”数据。那么我就在req里取出来这个宠物的id,然后用宠物model查找这个id的宠物。
具体做法一次是callback方式,promise方式,自定义方法的callback方式和自定义方法的promise方式:
var getPet = function(req, res) { // Pet.findById(req.params.pet_id, function (err, pet) { // if (err) { // res.json({message: 'error', data: err}); // return; // } // res.json({message: 'done', data: pet}); // }); // Pet.findById(req.params.pet_id).then(function(p) { // res.json({message: 'done', data: pet}); // }).catch(function(err) { // res.json({message: 'error', data: err}); // }); // Pet.anotherFindOne({'_id': req.params.pet_id}, function(err, pet) { // console.log('Pet.anotherFindOne'); // if (err) { // res.json({message: 'error', data: err}); // return; // } // res.json({message: 'done', data: pet}); // }); Pet.anotherFindOne({'_id': req.params.pet_id}).exec().then(function(pet) { res.json({message: 'done', data: pet}); }).catch(function(err) { res.json({message: 'error', data: err}); }); };
promise?
mongoose 有两种调用方式,1种callbacl,1种promise。
比如定义个getAll
1.callback
a.js 回调形式,外面 function getAll(cb){ xxModel.find({},cb); } module.exports.getAll=getAll; b.js var a=require('a'); a.getAll(function(err,result){ console.log(result); })
2.promise
a.js function personTest() { return Person.find({}).exec(); } b.js var a=requre('a'); a.getAll().then(fnction(rseult){ console.log(result); }).catch(function(err){ console.log(err); })