【问题标题】:Node.js mysql query passing to next function in async.waterfallNode.js mysql 查询传递给 async.waterfall 中的下一个函数
【发布时间】:2014-02-08 01:50:39
【问题描述】:

我在 node.js 中有一些使用 express 的代码。我将一个调用路由到从 mysql 数据库请求数据,我想要做的是将它传递给另一个函数,以将返回的 json 从表格形式(表查询)重组为层次结构类型 json。

我已经单独测试了脚本以重构我的 sql 查询的输出。但是,我无法将它从我的查询函数传递到我的新脚本(函数)

我只是没有看到我做错了什么。请提供任何帮助,谢谢。

exports.get_site_menu = function (req, res) {
    var dbc;
    console.log('In menu setup');
    async.waterfall([
        // get a connection

        function (callback) {
            db.db(callback);
        }

        ,
        querylookup, modifyjson
    ], completed);

    function querylookup(dbclient, res) {
        dbc = dbclient;
        dbc.query("SELECT categories, " +
            "subcategories, " +
            "pid, " +
            "title, " +
            "description " +
            "FROM MENU_SELECT_ACTIVE_VIEW " +
            "where company_id = ? and site_id = ?", [req.query.companyid, req.query.siteid], res);
    }

    function modifyjson(err, res) {

        categories = [];

        console.log('results ' + res);

        res.forEach(function (entry) {
            var cindex = categories.map(function (category) {
                return category.name;
            }).indexOf(entry.categories);

            console.log(cindex);
            if (cindex < 0) {
                // Not found in categories array
                cindex = categories.push({
                    name: entry.categories,
                    subcategories: []
                }) - 1; // -1 to fix the index
            }
            // Lets search the subcategory
            var category = categories[cindex];

            var sindex = category.subcategories.map(
                function (subcategory) {
                    return subcategory.name;
                }
            ).indexOf(entry.subcategories);

            if (sindex < 0) {
                // Not Found
                sindex = category.subcategories.push({
                    name: entry.subcategories,
                    items: []
                }) - 1;
            }
            // Subcategory exists. Just push
            category.subcategories[sindex].items.push({
                pid: entry.pid,
                description: entry.description,
                title: entry.title
            });
        });

        menu = {
            menu: {
                categories: categories
            }
        };
        console.log('menu ' + menu);
    }


    function completed(err, menu, fields) {
        if (dbc) dbc.end();
        if (err) {
            callback(err);
        } else {
            console.log(menu);
            res.contentType('json');
            res.send(JSON.stringify(menu));
        }
    }
};

【问题讨论】:

    标签: javascript mysql node.js express


    【解决方案1】:

    您需要将每个结果传递给自己的回调以传递下一个函数。我已经像这样重构了你的代码;

    exports.get_site_menu = function (req, res) {
        var dbc;
        console.log('In menu setup');
        async.waterfall([
            // get a connection
    
            function (callback) {
                db.db(callback, some_result);
            },
            function querylookup(dbclient, res, callback) {
                dbc = dbclient;
                dbc.query("SELECT categories, " +
                    "subcategories, " +
                    "pid, " +
                    "title, " +
                    "description " +
                    "FROM MENU_SELECT_ACTIVE_VIEW " +
                    "where company_id = ? and site_id = ?", [req.query.companyid, req.query.siteid], res);
                    callback(null, result_from_queryLookup);
            },
            function modifyjson(err, res, callback) {
    
                categories = [];
    
                console.log('results ' + res);
    
                res.forEach(function (entry) {
                    var cindex = categories.map(function (category) {
                        return category.name;
                    }).indexOf(entry.categories);
    
                    console.log(cindex);
                    if (cindex < 0) {
                        // Not found in categories array
                        cindex = categories.push({
                            name: entry.categories,
                            subcategories: []
                        }) - 1; // -1 to fix the index
                    }
                    // Lets search the subcategory
                    var category = categories[cindex];
    
                    var sindex = category.subcategories.map(
                        function (subcategory) {
                            return subcategory.name;
                        }
                    ).indexOf(entry.subcategories);
    
                    if (sindex < 0) {
                        // Not Found
                        sindex = category.subcategories.push({
                            name: entry.subcategories,
                            items: []
                        }) - 1;
                    }
                    // Subcategory exists. Just push
                    category.subcategories[sindex].items.push({
                        pid: entry.pid,
                        description: entry.description,
                        title: entry.title
                    });
                });
    
                menu = {
                    menu: {
                        categories: categories
                    }
                };
                console.log('menu ' + menu);
                callback(null, menu, fields);
            }
        ], function completed(err, menu, fields) {
            if (dbc) dbc.end();
            if (err) {
                callback(err);
            } else {
                console.log(menu);
                res.contentType('json');
                res.send(JSON.stringify(menu));
            }
        });
    };
    

    尤其是回调部分要小心。

    【讨论】:

    • hmmm 好的,我明白你的意思了...我现在收到此错误 db.db(callback, some_result); ^ ReferenceError: some_result 未定义在 fn (/Users/dpreston10/Dropbox/workspace/QwikAssistServer/node_modules) 的 async.waterfall.dbc (/Users/dpreston10/Dropbox/workspace/QwikAssistServer/data/getdata.js:119:29) /async/lib/async.js:517:34) 在 /Users/dpreston10/Dropbox/workspace/QwikAssistServer/node_modules/async/lib/async.js:441:34 在 process._tickCallback (node.js:415: 13)
    • some_result 是我的临时变量。你需要用你自己的替换它。我假设,第一个函数生成一个名为 some_result 的值,然后我将它传递给第二个函数,依此类推
    • 对不起 :-( 我只是没有通过它。无论我使用什么变量,我的查询结果都不会传递下去。传递给第一个函数的唯一变量是 2 个输入用于查询。
    • 但是,瀑布流不是这样工作的。需要一步步向下传递函数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 2015-04-20
    • 2014-08-31
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 2020-10-17
    相关资源
    最近更新 更多