渲染页面后Mongojs查询完成
Mongojs query finishing after rendering the page
var list = [];
db.posts.find({}, function(err, docs){
//console.log(docs);
list = docs;
});
yield this.render("index", {
posts: list
});
我有这个函数可以在从 mongo 数据库中提取一系列帖子后呈现页面。我知道这是因为 javascript 是异步的,但我似乎无法获得正确的顺序(获取数组,然后渲染)并且我看到的解决方案似乎与 koa 不能很好地融合。我将如何编写代码以便在呈现页面之前获取数组?
尝试以下操作:
var list = yield db.posts.find({}).toArray();
console.log(list);
yield this.render("index", {posts: list});
我不知道你用的是什么 mongodb 库,但似乎该库只支持回调。
要使用 yield
以 synchronous
风格编程,您必须使用 return promises、thunk、生成器等函数(如您在错误消息中看到的)。
您可以找到一个 mongodb 支持 promises 的库(我认为是 mongoosejs),或者您可以包装您正在使用的库。
这里有几个将您的库转换为可用格式的示例
// Manually change callback to promise returning function
var Promise = require('bluebird');
function find(criteria){
var deffered, list;
deffered = Promise.defer();
db.posts.find(criteria, function(err, results){
if(err){
deffered.reject(err);
}
else{
deffered.resolve(result);
}
}
return deffered.promise;
}
// in your returning function do something like this
list = yield find({});
this.body = yield render('sometemplate', {posts: list});
// Thunk based solution
var thunkify = require('thunkify');
db.posts.find = thunkify(db.posts.find);
// now db.posts.find() returns a thunk which is yieldable
list = yield db.posts.find({});
this.body = yield render('sometemplate', {posts: list});
var list = [];
db.posts.find({}, function(err, docs){
//console.log(docs);
list = docs;
});
yield this.render("index", {
posts: list
});
我有这个函数可以在从 mongo 数据库中提取一系列帖子后呈现页面。我知道这是因为 javascript 是异步的,但我似乎无法获得正确的顺序(获取数组,然后渲染)并且我看到的解决方案似乎与 koa 不能很好地融合。我将如何编写代码以便在呈现页面之前获取数组?
尝试以下操作:
var list = yield db.posts.find({}).toArray();
console.log(list);
yield this.render("index", {posts: list});
我不知道你用的是什么 mongodb 库,但似乎该库只支持回调。
要使用 yield
以 synchronous
风格编程,您必须使用 return promises、thunk、生成器等函数(如您在错误消息中看到的)。
您可以找到一个 mongodb 支持 promises 的库(我认为是 mongoosejs),或者您可以包装您正在使用的库。
这里有几个将您的库转换为可用格式的示例
// Manually change callback to promise returning function
var Promise = require('bluebird');
function find(criteria){
var deffered, list;
deffered = Promise.defer();
db.posts.find(criteria, function(err, results){
if(err){
deffered.reject(err);
}
else{
deffered.resolve(result);
}
}
return deffered.promise;
}
// in your returning function do something like this
list = yield find({});
this.body = yield render('sometemplate', {posts: list});
// Thunk based solution
var thunkify = require('thunkify');
db.posts.find = thunkify(db.posts.find);
// now db.posts.find() returns a thunk which is yieldable
list = yield db.posts.find({});
this.body = yield render('sometemplate', {posts: list});