我正在处理一个文字游戏,并试图在页面加载时返回一个随机 wordpair (我的收藏)。我使用了Express并根据this tutorial调整了我的代码(如果有的话)。
GET请求呈现我的页面很好,我试图在标题旁边发送一个随机的WordPair对象:
router.get('/', function(req, res, next) {
res.render('play', { title: 'play', random_wordpair: wordpair_controller.wordpair_random});
});
wordpair_random函数位于我已经制作的控制器文件中(它也成功管理列出wordpairs并创建新的等等)。
// Get random WordPair
exports.wordpair_random = function() {
WordPair.aggregate(
[{
$sample: {
size: 1
}
}]
)
.exec(function(err, random_wordpair) {
if (err) {
return next(err);
}
console.log(random_wordpair);
return random_wordpair;
});
};
然后在play.pug模板中,我只是试图显示这个结果:
h3 random wordpair selection is: #{random_wordpair}
但我所能看到的是呈现为HTML文本的函数。谁能告诉我我做错了什么?
我也理解我需要在数据库对象上调用我的函数来查看MongoDB $sample aggregation的文档,但是我已经看过各种示例,有些人不这样做。在我的db.wordpair.aggregate(...)
文件中初始化db
后,我尝试直接调用app.js
(或 WordPair 或 wordpairs ,因为它出现在mLab中) ,我得到未定义的错误。我的db
对象似乎不包含此请求的正确数据。
谢谢!
答案 0 :(得分:1)
我想你是在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);
};
然后在你的网络功能:
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 });
})
});