nodejs原型和使用mysql的嵌套回调

时间:2013-09-06 16:06:52

标签: javascript node.js callback nested

我在下面的代码中遇到两个问题。它是node.js模块的开始,用于注册存储在mysql数据库中的用户。

第一个问题是,在第一个查询的回调中,变量 this.connection 是未定义的。第二个问题是变量 user 在同一个回调中也是未定义的。因此代码在以下行崩溃:

this.connection.query('INSERT INTO users{{values values}}', {
                    values: {
                        user_name: user.username,
                        user_email: user.email,
                        user_password: user.password
                    }
                })

请让我知道如何以适当的方式解决这个问题。

非常感谢!

完整代码如下:

module.exports = usermodel;

//connection is a mysql-wrapper connection
function usermodel(connection)
{
    this.connection = connection;
}

playermodel.prototype = {

    registerByEmail: function (user, callback) {
        //check firts if the user already exists
        this.connection.query('SELECT user_id FROM users {{where data}}', {
            data: {
                user_email: user.email
            }
        },
        function (err, result) {

            if (err) {
                ...
            } else if (result.length > 0) {
                ...
            } else {
                // this.connection is undefined ????????????
                this.connection.query('INSERT INTO users {{values values}}', {
                    values: {
                        user_name: user.username,
                        user_email: user.email,
                        user_password: user.password
                    }
                }),
                function (err, result) {
                    ...
                }
            }
        });
    }

}

1 个答案:

答案 0 :(得分:0)

this.connection未定义,因为this.connection位于playermodel的实例上,传递给第一个查询的回调函数不知道playermodel实例的上下文。

不过应该定义

user。您可以通过绑定函数或在回调可以访问的变量中设置对this.connection的引用来绕过未定义的this

//Bind
        playermodel.prototype = {

        registerByEmail: function (user, callback) {
            //check firts if the user already exists
            this.connection.query('SELECT user_id FROM users {{where data}}', {
                data: {
                    user_email: user.email
                }
            },
            function (err, result) {

                if (err) {
                    ...
                } else if (result.length > 0) {
                    ...
                } else {
                    // this.connection is undefined ????????????
                    this.connection.query('INSERT INTO users {{values values}}', {
                        values: {
                            user_name: user.username,
                            user_email: user.email,
                            user_password: user.password
                        }
                    }),
                    function (err, result) {
                        ...
                    }
                }
            //HERE
            }.bind(this));
        }

    }

or

    //me reference to this
        playermodel.prototype = {

            registerByEmail: function (user, callback) {
                //HERE
                var me = this;
                //check firts if the user already exists
                this.connection.query('SELECT user_id FROM users {{where data}}', {
                    data: {
                        user_email: user.email
                    }
                },
                function (err, result) {

                    if (err) {
                        ...
                    } else if (result.length > 0) {
                        ...
                    } else {
                        //HERE
                        me.connection.query('INSERT INTO users {{values values}}', {
                            values: {
                                user_name: user.username,
                                user_email: user.email,
                                user_password: user.password
                            }
                        }),
                        function (err, result) {
                            ...
                        }
                    }
                });
            }

        }