Node JS中的内部类函数用法是抛出错误

时间:2016-09-01 20:04:27

标签: javascript node.js oop express

我正在学习Node JS,我正在学习如何在节点中创建OOP结构。我有一个简单的类,我使用函数来检查和创建数据库中的用户。当我在函数内部调用类函数时,我得到TypeError。我的班级代码,

var method = AccessRegisterAction.prototype;

function AccessRegisterAction(parameters) {

    this._bcrypt = require('bcrypt-nodejs');
    this._cassandra = require('cassandra-driver');
    this._async = require('async');


    this._uname = parameters.uname;
    this._email = parameters.email;
    this._passwd = parameters.passwd;

    //Connect to the cluster
    this._client = new this._cassandra.Client({contactPoints: ['127.0.0.1'], keyspace: 'testdb'});

    //this._bcrypt.hashSync("bacon");

}

/*
 * This method "createUser" is used to create new users
 *
 * First it will check for user's email is in database or not.
 *
 * If email is registered we will process accordingly,
 * else we will process accordingly.
 *
 * */

method.createUser = function () {
    var selectUserFromDBQuery = "SELECT uid from testdb.users WHERE email = '?' ALLOW FILTERING";

    this._client.execute(selectUserFromDBQuery, this._email, function (err, result) {

        //if there is not any error while fetching data
        if (!err) {

            //if there is result, it means we have email already registered
            if (result.rows.length > 0) {

                //so now we need to show user is already registered error
                //to the user
                this.errorWhileCreatingAccount(2);

            } else {

                //here we are checking user's username because
                //we have not found user's email in database and we
                //are good to go to register user
                this.userNameCheck();


            }
        }
        else {
            this.errorWhileCreatingAccount(1);
        }

    });
};


/*
 * This method will check for username in database.
 *
 * If there is username registered in database than we will
 * show error that username is taken otherwise
 * we will process to register user.
 * */
method.userNameCheck = function () {
    var checkUserNameQuery = "SELECT uid from testdb.users WHERE uname = '?' ALLOW FILTERING";

    this._client.execute(checkUserNameQuery, this._uname, function (err, result) {

        //if there is not any error while fetching data
        if (!err) {

            //if there is result, it means we have email already registered
            if (result.rows.length > 0) {

                //so username is taken and we need to tell user to
                //use different username
                this.errorWhileCreatingAccount(3);

            } else {

                //here we are registering user and adding information into database
                this.newUserCreate();

            }
        }
        else {
            this.errorWhileCreatingAccount(1);
        }

    });

};

/*
 * This method will create new user into database
 *
 * Simple as that
 * */
method.newUserCreate = function () {
};


/*
 * This function will throw an error which was occurred during the account creation process
 * */
method.errorWhileCreatingAccount = function (errorCode) {
    var _error = {error: "", msg: ""};

    switch (errorCode) {
        case 1:
            _error.error = true;
            _error.msg = "There was error while checking your information. Please try again.";
            break;
        case 2:
            _error.error = true;
            _error.msg = "You have already created account with this email. " +
                "Please use forgot password link if you don't remember your login details.";
            break;
        case 3:
            _error.error = true;
            _error.msg = "Username that you chose is already taken. Please try different username.";
            break;
        default:
            _error.error = true;
            _error.msg = "There was error an error. Please try again.";
            break
    }

};


// export the class
module.exports = AccessRegisterAction;

我得到的错误信息是,

events.js:160
      throw er; // Unhandled 'error' event
      ^

TypeError: this.userNameCheck is not a function
    at /Users/user/Desktop/Projects/nodejs/testproject/application/classes/UserAccessAction/AccessRegisterAction.js:55:22
    at next (/Users/user/node_modules/cassandra-driver/lib/utils.js:616:14)
    at readCallback (/Users/user/node_modules/cassandra-driver/lib/request-handler.js:202:5)
    at Connection.invokeCallback (/Users/user/node_modules/cassandra-driver/lib/connection.js:584:5)
    at Connection.handleResult (/Users/user/node_modules/cassandra-driver/lib/connection.js:522:8)
    at emitThree (events.js:116:13)
    at ResultEmitter.emit (events.js:194:7)
    at ResultEmitter.each (/Users/user/node_modules/cassandra-driver/lib/streams.js:482:17)
    at ResultEmitter._write (/Users/user/node_modules/cassandra-driver/lib/streams.js:466:10)
    at doWrite (_stream_writable.js:307:12)

和我调用此函数的代码是,

var param = {uname: "testname", email: "fake@test.com", passwd: "test123"};
    var AccessRegisterAction = require('../application/classes/UserAccessAction/AccessRegisterAction');
    var register = new AccessRegisterAction(param);
    register.createUser();

所以有人能告诉我我的错误在哪里吗?如何将oop与nodejs一起使用?

由于

2 个答案:

答案 0 :(得分:2)

由于您看起来像是在使用ES5风格,因此我不打算推​​荐箭头功能。但是,正如评论中提到的那样,this的值在每个function语句中都会发生变化。因此,您需要在输入内部函数之前保存您想要使用的上下文。例如:

method.createUser = function () {
    var context = this;
    var selectUserFromDBQuery = "SELECT uid from testdb.users WHERE email = '?' ALLOW FILTERING";

    this._client.execute(selectUserFromDBQuery, this._email, function (err, result) {

    //if there is not any error while fetching data
    if (!err) {

        //if there is result, it means we have email already registered
        if (result.rows.length > 0) {

            //so now we need to show user is already registered error
            //to the user
            context.errorWhileCreatingAccount(2);

        } else {

            //here we are checking user's username because
            //we have not found user's email in database and we
            //are good to go to register user
            context.userNameCheck();


        }
    }
    else {
            context.errorWhileCreatingAccount(1);
        }

    });
};

在尝试从新函数中调用this的每种方法中执行此操作。

答案 1 :(得分:0)

您应该能够在Node中轻松使用原型 您需要首先使用对象,例如新的AccessRegisterAction(),您可以像往常一样使用这些方法。

由于您未发布用于访问该方法的代码,因此很难确定。