javascript - 为什么 queryAsync() 会导致添加元数据?

标签 javascript mysql node.js asynchronous metadata

我按照问题答案的规定使用了 queryAsync(),它确实有效,但它向我的查询结果添加了大量额外的元数据,否则这是一个简单的查询。


这是我用来处理/执行查询并记录结果的内容:

var retrieveSettings = Promise.method(function (username, connection) {
    console.log('User ' + username + ' retrieving settings...');
    var q = 'select * from sales_settings';
    return connection.queryAsync(q).then(function (rows, fields) {
        list = [];
        for (x = 0; x < rows.length; x++) {
            list.push(rows[x]);
        }
        //console.log('Settings: ' + JSON.stringify(list, null, 4));
        return list;
    });
});

这是记录的结果:

Settings: [
    [
        {
            "group_name": "add_auto",
            "commission_rate": 0,
            "monthly_req": 0,
            "category_name": "Auto",
            "commission_type": "none",
            "group_title": "Added Auto"
        },
        {
            "group_name": "add_fire",
            "commission_rate": 0,
            "monthly_req": 0,
            "category_name": "Fire",
            "commission_type": "none",
            "group_title": "Added Fire"
        },
        {
            "group_name": "bank_dep",
            "commission_rate": 25,
            "monthly_req": 0,
            "category_name": "Bank",
            "commission_type": "static",
            "group_title": "Bank Deposit"
        },
        {
            "group_name": "bank_loan",
            "commission_rate": 75,
            "monthly_req": 8,
            "category_name": "Bank",
            "commission_type": "static",
            "group_title": "Bank Loan"
        },
        {
            "group_name": "health",
            "commission_rate": 0.084,
            "monthly_req": 4,
            "category_name": "Health",
            "commission_type": "premium",
            "group_title": "Health App"
        },
        {
            "group_name": "life",
            "commission_rate": 0.084,
            "monthly_req": 8,
            "category_name": "Life",
            "commission_type": "premium",
            "group_title": "Life App"
        },
        {
            "group_name": "new_auto",
            "commission_rate": 0.03,
            "monthly_req": 32,
            "category_name": "Auto",
            "commission_type": "rate",
            "group_title": "Raw New Auto"
        },
        {
            "group_name": "new_fire",
            "commission_rate": 0.03,
            "monthly_req": 20,
            "category_name": "Fire",
            "commission_type": "rate",
            "group_title": "Raw New Fire"
        }
    ],
    [
        {
            "catalog": "def",
            "db": "officeball",
            "table": "sales_settings",
            "orgTable": "sales_settings",
            "name": "group_name",
            "orgName": "group_name",
            "filler1": [
                12
            ],
            "charsetNr": 33,
            "length": 135,
            "type": 253,
            "flags": 20483,
            "decimals": 0,
            "filler2": [
                0,
                0
            ],
            "zeroFill": false,
            "protocol41": true
        },
        {
            "catalog": "def",
            "db": "officeball",
            "table": "sales_settings",
            "orgTable": "sales_settings",
            "name": "commission_rate",
            "orgName": "commission_rate",
            "filler1": [
                12
            ],
            "charsetNr": 63,
            "length": 13,
            "type": 246,
            "flags": 4097,
            "decimals": 3,
            "filler2": [
                0,
                0
            ],
            "zeroFill": false,
            "protocol41": true
        },
        {
            "catalog": "def",
            "db": "officeball",
            "table": "sales_settings",
            "orgTable": "sales_settings",
            "name": "monthly_req",
            "orgName": "monthly_req",
            "filler1": [
                12
            ],
            "charsetNr": 63,
            "length": 11,
            "type": 3,
            "flags": 4097,
            "decimals": 0,
            "filler2": [
                0,
                0
            ],
            "zeroFill": false,
            "protocol41": true
        },
        {
            "catalog": "def",
            "db": "officeball",
            "table": "sales_settings",
            "orgTable": "sales_settings",
            "name": "category_name",
            "orgName": "category_name",
            "filler1": [
                12
            ],
            "charsetNr": 33,
            "length": 135,
            "type": 253,
            "flags": 4097,
            "decimals": 0,
            "filler2": [
                0,
                0
            ],
            "zeroFill": false,
            "protocol41": true
        },
        {
            "catalog": "def",
            "db": "officeball",
            "table": "sales_settings",
            "orgTable": "sales_settings",
            "name": "commission_type",
            "orgName": "commission_type",
            "filler1": [
                12
            ],
            "charsetNr": 33,
            "length": 135,
            "type": 253,
            "flags": 4097,
            "decimals": 0,
            "filler2": [
                0,
                0
            ],
            "zeroFill": false,
            "protocol41": true
        },
        {
            "catalog": "def",
            "db": "officeball",
            "table": "sales_settings",
            "orgTable": "sales_settings",
            "name": "group_title",
            "orgName": "group_title",
            "filler1": [
                12
            ],
            "charsetNr": 33,
            "length": 72,
            "type": 253,
            "flags": 4097,
            "decimals": 0,
            "filler2": [
                0,
                0
            ],
            "zeroFill": false,
            "protocol41": true
        }
    ]
]

为什么这个不寻常的元数据被添加到我的查询结果中?

最佳答案

看起来您正在使用bluebird,在这种情况下您可以使用.spread:

var retrieveSettings = Promise.method(function (username, connection) {
    console.log('User ' + username + ' retrieving settings...');
    var q = 'select * from sales_settings';
    return connection.queryAsync(q).spread(function (rows, fields) {
        list = [];
        for (x = 0; x < rows.length; x++) {
            list.push(rows[x]);
        }
        //console.log('Settings: ' + JSON.stringify(list, null, 4));
        return list;
    });
});

mysql模块的问题是它不符合node js回调标准(err, result)。相反,它使用 (err, result1, result2)。由于函数只能抛出一个异常或返回一个值,因此 bluebird 返回一个 [result1, result2] 数组以避免信息丢失。

.spread 类似于 .then,只不过它假设实现值是一个数组并将数组的值分布到参数上。

关于javascript - 为什么 queryAsync() 会导致添加元数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22676475/

相关文章:

java - 在 MySQL 表中存储毫秒(使用 Java 存储/检索)

php - mysql_real_escape_string 的 PDO 等效项是什么?

php - 将一行添加到另一行

javascript - 将异步方法之一重写为使用 Promise 的方法

javascript - iframe 内的 AngularJS ng-src

javascript - 如何在onclick函数中选择动态div

javascript - 如何在循环中填写JSON?

node.js - Azure Linux Web 服务器没有响应我的 Docker 容器

javascript - D3.csv 未加载 csv 文件

Javascript:混合构造函数模式和揭示模块模式