【问题标题】:Sails Query Returns Nothing After count() QuerySails 查询在 count() 查询后不返回任何内容
【发布时间】:2017-11-07 13:24:03
【问题描述】:

以下执行时返回空结果。没有 Count 查询也没关系,但即便如此,仍会返回正确的值,但响应始终为空。我有比赛条件问题吗?

module.exports = {
getSites: function (req, res) {
    var sites = [];
    Site.find({ company: req.session.companyID }).populate('locations').exec(function afterFind(err, results) {

        for (index in results) {

            var siteObj = {};

            siteObj = results[index];


            sails.models['site_users__user_sites'].count({ user_sites: results[index].id }).exec(function found(err, counted) {
                if (err) {
                    sails.log.error(err);
                }
                sails.log.debug(counted); // Prints correct number
                siteObj['user_count'] = counted;
                sails.log.debug(siteObj['user_count']); // Shows value is present
                sites.push(siteObj);
            });
        }
    });

    sails.log.debug(sites); // Nothing
    return res.json(sites); // Nothing
},}

更新:

module.exports = {
getSites: function (req, res) {
    var sites = [];

    Site.find({ company: req.session.companyID }).populate('locations').exec(function afterFind(err, results) {
        var completedResults = 0;

        for (index in results) {
            sails.log.debug(results);
            var siteObj = {};

            siteObj = results[index];

            sails.models['site_users__user_sites'].count({ user_sites: results[index].id }).exec(function found(err, counted) {
                if (err) {
                    sails.log.error(err);
                }
                siteObj['user_count'] = counted;
                sites.push(siteObj);

                completedResults++;
                if(completedResults === results.length) {
                    sails.log.debug(sites);
                    res.json(sites);
                }
            });
        }
    });
},
}

更新到上述内容后,记录“结果”会生成所有正确的记录。但是,当返回“站点”时,返回的两个条目是重复的。

更新 2

我感觉在访问 for 循环中的下一项之前异步查询没有完成,因此将值分配给了错误的对象。

更新 3 提供日志以寻求帮助。

这是“结果”的日志

[ { locations: [],
company: 1,
name: 'N',
id: 1,
createdAt: '2017-06-06T10:07:25.000Z',
updatedAt: '2017-06-06T10:07:26.000Z' },
{ locations: [],
company: 1,
name: 'W',
id: 2,
createdAt: '2017-06-06T11:08:08.000Z',
updatedAt: '2017-06-06T11:08:08.000Z' } ]

这是“网站”的日志

[ { locations: [],
company: 1,
name: 'W',
id: 2,
createdAt: '2017-06-06T11:08:08.000Z',
updatedAt: '2017-06-06T11:08:08.000Z',
user_count : 1 },
{ locations: [],
company: 1,
name: 'W',
id: 2,
createdAt: '2017-06-06T11:08:08.000Z',
updatedAt: '2017-06-06T11:08:08.000Z',
user_count : 1 } ]

【问题讨论】:

    标签: javascript mysql node.js sails.js


    【解决方案1】:

    因为

    sails.log.debug(sites); // Nothing
    return res.json(sites); // Nothing
    

    在之前执行

    sails.models['site_users__user_sites'].count({ user_sites: results[index].id }).exec(function found(err, counted) {
        if (err) {
            sails.log.error(err);
        }
        sails.log.debug(counted); // Prints correct number
        siteObj['user_count'] = counted;
        sails.log.debug(siteObj['user_count']); // Shows value is present
        sites.push(siteObj);
    });
    

    要修复它,您需要在异步执行函数完成所有结果后调用sails.log.debugres.json。像这样:

    module.exports = {
        getSites: function (req, res) {
            const sites = [];
            Site.find({ company: req.session.companyID }).populate('locations').exec(function afterFind(err, results) {
    
                let completedResults = 0;
    
                for (index in results) {
    
                    const siteObj = results[index];
    
    
                    sails.models['site_users__user_sites'].count({ user_sites: results[index].id }).exec(function found(err, counted) {
                        if (err) {
                            sails.log.error(err);
                        }
                        sails.log.debug(counted); // Prints correct number
                        siteObj['user_count'] = counted;
                        sails.log.debug(siteObj['user_count']); // Shows value is present
                        sites.push(siteObj);
    
                        completedResults++;
                        if(completedResults === results.length) {
                            sails.log.debug(sites);
                            res.json(sites);
                        }
                    });
                }
            });
    
        }
    }
    

    【讨论】:

    • 这可以正常工作并返回,但现在我收到了重复的数据。在这种情况下,我只检索 2 条站点记录(在第一次查询后是正确的),但是响应复制了最后一个条目。
    • @BenBrookes 你有例子吗?
    • @BenBrookes 你有结果对象的匿名示例吗?
    • 添加到我的初始帖子中。
    • 不幸的是产生了同样的结果
    【解决方案2】:

    find、count 和 .exec 本质上是异步的 您正在返回 sites 变量,它最初是一个空数组,甚至在计算 afterFind 函数之前,更不用说 count 之后的第二个 exec 了。

    【讨论】:

      猜你喜欢
      • 2012-04-14
      • 1970-01-01
      • 2021-04-24
      • 2013-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多