您好我正在尝试访问mongoose中的find返回的元素,并在异步和回调情况下遇到一些问题。
以下是更好理解的代码。
function retrieveBudgets(email, callback) {
models.User.find({email: email},{budget:true}, function(err,budgets) {
if (err) {
callback(err, null);
} else {
callback(null, budgets);
}
});
};
retrieveBudgets(user.email, function(err, budgets) {
if (err) {
console.log(err);
}
budgets.forEach(function(budget){
console.log(JSON.stringify(budget, null, 4));
});
});
所以此行console.log(JSON.stringify(budget, null, 4));
正常工作并以json格式将对象打印到屏幕,但是如何将每个对象存储到此处的对象数组中?如果我尝试在同一行推送到一个数组,我会收到一个错误。
我看到一些类似的问题,但我没有取得任何进展。 编辑:____________________________________________________________ 我做了一点点破解让它工作,我移动了resrenren up,所以渲染页面是在回调的同时完成但我不能看到这是正确的解决方案任何想法
var user=req.session.user;
res.locals.budgets=[];
function retrieveBudgets(email, callback) {
models.User.find({email: email},{budget:true}, function(err, budgets) {
if (err) {
callback(err, null);
} else {
callback(null, budgets);
}
});
};
retrieveBudgets(user.email, function(err, budgets) {
if (err) {
console.log(err);
}
res.locals.budgets = budgets.map((function(b){ return b; });
res.render('budget/budget.jade',{ csrfToken: req.csrfToken() });
});
这项工作我可以通过当地人访问预算,所以对此的任何反馈都会很好我怀疑它是正确的方法吗?
答案 0 :(得分:2)
从budgets
调用获得的retrieveBudgets
返回值已经是一个数组。
这可以通过调用budgets.forEach
来证明,这是一种阵列上的方法。
是否需要从项目中创建新数组?这很容易做到:
var myNewArray = budgets.map((function(b){ return b; });
这一行代码将map原始预算数组放入包含每个预算项的新数组中。
还有其他创建新数组的方法,具体取决于您需要做什么
从以下评论中更新
我真正想做的是使用查询之外的预算,以便将其传递给视图
在这种情况下,您需要在回调中呈现视图并将预算传递给视图:
router.get("/foo", function(req, res, next){
retrieveBudgets(user.email, function(err, budgets) {
if (err) { return next(err); }
res.render('budget/budget.jade',{
budgets: budgets,
csrfToken: req.csrfToken()
});
});
});
这是使这项工作唯一且正确的方法。
如果您尝试在不等待回调完成的情况下执行此操作,则您的budgets
数组中不会包含任何数据。因此,您必须等待执行回调,然后使用传递给视图的budgets
(或单budget
或其他)呈现您的视图。
(使用promises有各种变体,但我发现回调是处理这个问题的更简单方法。)
答案 1 :(得分:1)
将您传递对象的行转到您的玉器文件
res.render('budget/budget.jade',{
csrfToken: req.csrfToken(),
budgets: budgets.map(function(b) {return b;})
});
这会将budgets
传递给您的jade文件,您应该可以在那里访问它。