0

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

第一个问题是,在第一个查询的回调中,变量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) {
                    ...
                }
            }
        });
    }

}
4

1 回答 1

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

        }
于 2013-09-06T19:49:20.193 回答