KeystoneJS:在版本4中填充数据库中的条目时出错

时间:2017-04-18 21:41:18

标签: node.js mongodb keystonejs

我最近遇到了使用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);
        });
    });

到目前为止,我还没有找到任何迹象表明为什么会出现问题。我试图多次更改使用的变量(我已经看到了使用错误的单词和该单词的复数会导致问题的问题)没有任何运气。

有没有人有任何想法我应该开始寻找?

1 个答案:

答案 0 :(得分:0)

你过早地打电话给next;在运行数据库查询以获取Groups之前,视图会呈现。您应该将Group.model.find()调用放在Enquiry.model.find()查询中,或使用像async这样的控制流库(我认为默认情况下与Keystone一起安装)以并行运行这两个函数,设置本地,然后渲染视图。假设您已经有EnquiryGrouplocals等变量...

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();
    });
});