MongoDB:can';t从集合中返回随机文档

MongoDB:can';t从集合中返回随机文档,mongodb,function,express,random,controller,Mongodb,Function,Express,Random,Controller,我正在做一个文字游戏,试图在页面加载时返回一个随机字对(我的集合)。我使用的是Express,如果有任何用处,我已经修改了我的代码 GET请求可以很好地呈现我的页面,我正在尝试在标题旁边发送一个随机字对对象: router.get('/', function(req, res, next) { res.render('play', { title: 'play', random_wordpair: wordpair_controller.wordpair_random}); }); wor

我正在做一个文字游戏,试图在页面加载时返回一个随机字对(我的集合)。我使用的是Express,如果有任何用处,我已经修改了我的代码

GET请求可以很好地呈现我的页面,我正在尝试在标题旁边发送一个随机字对对象:

router.get('/', function(req, res, next) {
  res.render('play', { title: 'play', random_wordpair: wordpair_controller.wordpair_random});
});
wordpair_random函数位于我制作的一个控制器文件中(该文件还成功地管理列出单词对和创建新的单词对等)

然后在play.pug模板中,我只是尝试显示以下结果:

h3 random wordpair selection is: #{random_wordpair}
但我所能看到的只是呈现为HTML文本的函数。谁能告诉我我做错了什么

我也了解MongoDB的文档,我需要在数据库对象上调用我的函数,但我看到了各种示例,有些示例没有这样做。在我的
app.js
文件中初始化
db
后,当我尝试直接调用
db.wordpair.aggregate(…)
(或在mLab中显示的wordpair或wordpairs)时,我会遇到未定义的错误。我的
db
对象似乎不包含此请求的正确数据

谢谢


我想你是在Node.JS中写的。Node.JS中的一个核心特性是非阻塞IO模型。这意味着,代码不会等待数据库调用完成后才继续

另一个需要正确理解的概念是Node.JS,它是JavaScript的一个变体,本质上是一个函数式编程。将函数分配给JSON对象的属性(如下所示)不会导致函数执行。它只是创建一个指向函数体的指针,这就是应用程序打印函数本身的原因

{ title: 'play', random_wordpair: wordpair_controller.wordpair_random}
要解决此问题,请使用回调

exports.wordpair_random = function(callback) {
    WordPair.aggregate([$sample: {size: 1}}]).exec(callback);
};
然后在web功能中:

router.get('/', function(req, res, next) {
    wordpair_controller.wordpair_random(function(err, result) {
        //Handle errors if needed. 
        res.render('play', { title: 'play', random_wordpair:result });
    })
});

这是完美的,谢谢你的解释,而不仅仅是给出一个答案!
router.get('/', function(req, res, next) {
    wordpair_controller.wordpair_random(function(err, result) {
        //Handle errors if needed. 
        res.render('play', { title: 'play', random_wordpair:result });
    })
});