Jade 模板不获取从 express 传递的数据
Jade template doesn't get the data passed from express
我知道 问题的标题几乎相同,但问题不同。
我正在使用内置于最新 Keystone.js 版本中的 Jade 模板引擎 v.1.11.0。在控制器中,我使用两个 view.on('init') 回调查询数据。第一个回调只查询一条记录,总是通过。第二个有时不会。
category.js
var keystone = require('keystone');
var async = require('async');
exports = module.exports = function (req, res) {
var view = new keystone.View(req, res);
var locals = res.locals;
// Init locals
locals.section = 'category';
locals.filters = {
category: req.params.category
};
locals.data = {
sections: [],
category: {}
};
// Load current category
view.on('init', function (next) {
var q = keystone.list('Category').model.findOne({
key: locals.filters.category
});
q.exec(function (err, result) {
locals.data.category = result;
locals.section = locals.data.category.name.toLowerCase();
next(err);
});
});
// Load sections
view.on('init', function (next) {
var q = keystone.list('Section').model.find().where('category').in([locals.data.category]).sort('sortOrder').exec(function(err, results) {
if (err || !results.length) {
return next(err);
}
async.each(results, function(section, next) {
keystone.list('Article').model.find().where('section').in([section.id]).sort('sortOrder').exec(function(err, articles){
var s = section;
if (articles.length) {
s.articles = articles;
locals.data.sections.push(s);
} else {
locals.data.sections.push(s);
}
});
}, function(err) {
console.log(locals.data.sections);
});
next(err);
});
});
view.render('category');
};
在我看来,我应该总是让这个通过:
sections: { _id: 574b909b43ff68163ed86bf2, publicTitle: 'Title 1', key: 'name-1', sortOrder: 3, name: 'Name 1', __v: 0, category: 574b8960947f45f034ac89b4, text: '', image: {} }
category: { _id: 574b8960947f45f034ac89b4, key: 'blabla', sortOrder: 1, name: 'Blabla', __v: 0, image: {} }
但是 60% 的时候,我得到这个:
sections:
category: { _id: 574b8960947f45f034ac89b4, key: 'johndoe', sortOrder: 1, name: 'JohnDoe', __v: 0, image: {} }
奇怪的是,如果我转到另一个类别,它有 更多 个部分并且喜欢 30 篇文章,我有 90% 的时间得到部分,但仍然有 10% 的部分丢失.这在开发和生产中都存在。
有些“next()”触发得太早了吗?我看不出哪里搞砸了。
好的。在阅读 async
之后,我设法使用 async.parallel
.
使其正常工作
var keystone = require('keystone');
var async = require('async');
exports = module.exports = function (req, res) {
var view = new keystone.View(req, res);
var locals = res.locals;
// Init locals
locals.section = 'category';
locals.filters = {
category: req.params.category
};
locals.data = {
sections: [],
category: {}
};
// Load current category
view.on('init', function (next) {
var q = keystone.list('Category').model.findOne({
key: locals.filters.category
});
q.exec(function (err, result) {
locals.data.category = result;
locals.section = locals.data.category.name.toLowerCase();
getChildrenRecords(locals.data.category, next);
});
});
function getChildrenRecords(category, next){
var q = keystone.list('Section').model.find().where('category').in([category]).sort('sortOrder').exec(function(err, results) {
if (err || !results.length) {
return next(err);
}
callItems = [];
for(var i = 0; i < results.length; i++) {
var data = results[i];
callItems.push(makeCallbackFunction(data));
}
function makeCallbackFunction(section) {
return function (callback) {
keystone.list('Article').model.find().where('section').in([section.id]).sort('sortOrder').exec(function(err, articles){
if (err) return callback(err);
if (articles.length) { section.articles = articles; }
locals.data.sections.push(section);
callback();
});
};
}
async.parallel(callItems, function(err, results){
next(err);
});
});
}
// Render the view
view.render('category');
};
我知道
我正在使用内置于最新 Keystone.js 版本中的 Jade 模板引擎 v.1.11.0。在控制器中,我使用两个 view.on('init') 回调查询数据。第一个回调只查询一条记录,总是通过。第二个有时不会。
category.js
var keystone = require('keystone');
var async = require('async');
exports = module.exports = function (req, res) {
var view = new keystone.View(req, res);
var locals = res.locals;
// Init locals
locals.section = 'category';
locals.filters = {
category: req.params.category
};
locals.data = {
sections: [],
category: {}
};
// Load current category
view.on('init', function (next) {
var q = keystone.list('Category').model.findOne({
key: locals.filters.category
});
q.exec(function (err, result) {
locals.data.category = result;
locals.section = locals.data.category.name.toLowerCase();
next(err);
});
});
// Load sections
view.on('init', function (next) {
var q = keystone.list('Section').model.find().where('category').in([locals.data.category]).sort('sortOrder').exec(function(err, results) {
if (err || !results.length) {
return next(err);
}
async.each(results, function(section, next) {
keystone.list('Article').model.find().where('section').in([section.id]).sort('sortOrder').exec(function(err, articles){
var s = section;
if (articles.length) {
s.articles = articles;
locals.data.sections.push(s);
} else {
locals.data.sections.push(s);
}
});
}, function(err) {
console.log(locals.data.sections);
});
next(err);
});
});
view.render('category');
};
在我看来,我应该总是让这个通过:
sections: { _id: 574b909b43ff68163ed86bf2, publicTitle: 'Title 1', key: 'name-1', sortOrder: 3, name: 'Name 1', __v: 0, category: 574b8960947f45f034ac89b4, text: '', image: {} }
category: { _id: 574b8960947f45f034ac89b4, key: 'blabla', sortOrder: 1, name: 'Blabla', __v: 0, image: {} }
但是 60% 的时候,我得到这个:
sections:
category: { _id: 574b8960947f45f034ac89b4, key: 'johndoe', sortOrder: 1, name: 'JohnDoe', __v: 0, image: {} }
奇怪的是,如果我转到另一个类别,它有 更多 个部分并且喜欢 30 篇文章,我有 90% 的时间得到部分,但仍然有 10% 的部分丢失.这在开发和生产中都存在。
有些“next()”触发得太早了吗?我看不出哪里搞砸了。
好的。在阅读 async
之后,我设法使用 async.parallel
.
var keystone = require('keystone');
var async = require('async');
exports = module.exports = function (req, res) {
var view = new keystone.View(req, res);
var locals = res.locals;
// Init locals
locals.section = 'category';
locals.filters = {
category: req.params.category
};
locals.data = {
sections: [],
category: {}
};
// Load current category
view.on('init', function (next) {
var q = keystone.list('Category').model.findOne({
key: locals.filters.category
});
q.exec(function (err, result) {
locals.data.category = result;
locals.section = locals.data.category.name.toLowerCase();
getChildrenRecords(locals.data.category, next);
});
});
function getChildrenRecords(category, next){
var q = keystone.list('Section').model.find().where('category').in([category]).sort('sortOrder').exec(function(err, results) {
if (err || !results.length) {
return next(err);
}
callItems = [];
for(var i = 0; i < results.length; i++) {
var data = results[i];
callItems.push(makeCallbackFunction(data));
}
function makeCallbackFunction(section) {
return function (callback) {
keystone.list('Article').model.find().where('section').in([section.id]).sort('sortOrder').exec(function(err, articles){
if (err) return callback(err);
if (articles.length) { section.articles = articles; }
locals.data.sections.push(section);
callback();
});
};
}
async.parallel(callItems, function(err, results){
next(err);
});
});
}
// Render the view
view.render('category');
};