Javascript Sails查询在count()查询之后不返回任何内容

Javascript Sails查询在count()查询之后不返回任何内容,javascript,mysql,node.js,sails.js,Javascript,Mysql,Node.js,Sails.js,执行以下命令时返回空结果。不使用Count查询也可以,但即使如此,仍然会返回正确的值,但响应始终为空。我是否有比赛条件问题 module.exports = { getSites: function (req, res) { var sites = []; Site.find({ company: req.session.companyID }).populate('locations').exec(function afterFind(err, results) {

执行以下命令时返回空结果。不使用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 提供日志以获取帮助

这是“结果”的日志

这是“站点”的日志

因为

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);
});
要修复它,您需要在async exec函数完成所有结果后调用
sails.log.debug
res.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);
                    }
                });
            }
        });

    }
}
因为

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);
});
要修复它,您需要在async exec函数完成所有结果后调用
sails.log.debug
res.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);
                    }
                });
            }
        });

    }
}

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

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

这可以正常工作并正确返回,但现在我收到了重复的数据。在本例中,我只检索了2条站点记录(在第一次查询后是正确的),但随后响应重复了最后一条记录。@BenBrookes你有示例吗?@BenBrookes你有结果对象的匿名示例吗?添加到我的第一篇文章中。不幸的是,产生了相同的结果。这可以正常工作并正确返回,除了现在,我收到了重复的数据。在本例中,我只检索了2条站点记录(在第一次查询后是正确的),但响应重复了最后一条记录。@BenBrookes您有没有示例?@BenBrookes您有没有结果对象的匿名示例?添加到我的初始帖子中。不幸的是,产生了相同的结果