我最近遇到了使用KeystoneJS 0.3.22中的关系填充项目的问题。根据以下post,这是版本3中的问题,但不是版本4中的问题。 升级到版本4后,我的前端表单似乎从我的数据库填充数据时出错。
我得到的错误是:
Sorry, an error occurred loading the page (500)
/home/dani/cns/templates/views/contact.pug:58
56| label Select the Clients that should be notified
57| select#selectboxgroups(name='groupSelect', multiple='multiple')
> 58| for record in records
59| option(value=record.groupname, selected=formData['record.groupname']) #{record.groupName}
60| .form-group
61| input(type='checkbox', name='smsmessage')
Cannot read property 'length' of undefined
以下代码是我的init函数,包括Group.model.find,它填充了记录。
view.on('init', function(next) {
Enquiry.model.find().where('finalIncident', "No").select('incidentNumber updateNumber').exec(function(err,data){
if(err)return console.log('error while fetching list of active incidents', err);
var dataFiltered = getLatest(data);
var incidents = [];
for(var i=0; i<dataFiltered.length; i++){
incidents.push({'incidentid': dataFiltered[i]._id, 'incidentNumber': dataFiltered[i].incidentNumber});
}
locals.incidents = incidents;
//console.log(locals.incidents);
return next();
});
Group.model.find().sort('name').exec(function(err,data){
if(err)return console.log('error while fetching client list for contact page', err);
var records = [];
for(var x=0; x<data.length; x++){
records.push({'groupid': data[x]._id, 'groupName': data[x].name });
}
locals.records = records;
console.log(locals);
});
});
到目前为止,我还没有找到任何迹象表明为什么会出现问题。我试图多次更改使用的变量(我已经看到了使用错误的单词和该单词的复数会导致问题的问题)没有任何运气。
有没有人有任何想法我应该开始寻找?
答案 0 :(得分:0)
你过早地打电话给next
;在运行数据库查询以获取Groups
之前,视图会呈现。您应该将Group.model.find()
调用放在Enquiry.model.find()
查询中,或使用像async
这样的控制流库(我认为默认情况下与Keystone一起安装)以并行运行这两个函数,设置本地,然后渲染视图。假设您已经有Enquiry
,Group
和locals
等变量...
var async = require('async');
view.on('init', function(next) {
async.parallel([
function (cb) {
Enquiry.model.find().where('finalIncident', "No").select('incidentNumber updateNumber').exec(function(err,data){
if(err) return cb('error while fetching list of active incidents', err);
var dataFiltered = getLatest(data);
var incidents = [];
for(var i=0; i<dataFiltered.length; i++){
incidents.push({'incidentid': dataFiltered[i]._id, 'incidentNumber': dataFiltered[i].incidentNumber});
}
locals.incidents = incidents;
//console.log(locals.incidents);
return cb(null);
});
},
function (cb) {
Group.model.find().sort('name').exec(function(err,data){
if(err)return cb('error while fetching client list for contact page', err);
var records = [];
for(var x=0; x<data.length; x++){
records.push({'groupid': data[x]._id, 'groupName': data[x].name });
}
locals.records = records;
console.log(locals);
return cb(null);
});
}
], function (err, results) {
console.log(err);
return next();
});
});