在count()Query之后,Sails查询返回Nothing

时间:2017-06-06 13:34:18

标签: 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) {

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

更新到上述内容后,记录"结果"产生所有正确的记录。但是,当返回" 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' } ]

这是" sites"

的日志
[ { 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 } ]

2 个答案:

答案 0 :(得分:0)

这是因为

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

    }
}

答案 1 :(得分:0)

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