2016-09-01 2 views
0

ノードJSを学習しています。ノードにOOP構造を作成する方法を学習しています。私は、データベース内のユーザをチェックして作成するための関数を使っているシンプルなクラスを持っています。私は関数内でクラス関数を呼び出すときにTypeErrorを取得しています。私のクラスのコード、ノードJSのインナークラス関数の使用がエラーを投げています

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: "[email protected]", passwd: "test123"}; 
    var AccessRegisterAction = require('../application/classes/UserAccessAction/AccessRegisterAction'); 
    var register = new AccessRegisterAction(param); 
    register.createUser(); 

あるので、誰も私を伝えることができます私の間違いはどこですか? oopとnodejをどうやって使うことができますか?あなたは(たとえば、最初に新しいAccessRegisterActionをオブジェクトを使用する必要が ノードに簡単に十分なプロトタイプを使用することができるはず

おかげ

+1

'this.userNameCheck();を呼び出すと、間違った' this'が使用されます。あなたは別の関数でそれを呼び出しているので、コンテキストがあなたのクラスを指していません。 – vlaz

+0

関数を呼び出すために 'this'を使わないとどうすれば使えますか? –

答えて

1

あなたがES5スタイルを使用しているように見えるので、私は矢印機能をお勧めしません。しかし、コメントに記載されているように、functionステートメントの内部ではthisという値が変わります。したがって、内部関数を入力する前に、使用したいコンテキストを保存する必要があります。たとえば:

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を呼び出そうとした各方法でこれを行います。

+0

ありがとう@Amleonrad、それは私のために働いた。 :D –

0

)は、あなたはいつものようにメソッドを使用することができると思います。

メソッドにアクセスするために使用しているコードを投稿していないので、確かめるのは難しいです。

+0

最新の投稿を確認してください –

+0

ありがとうございました。しかし@Amleonardからの答えは私のために働いた –

関連する問題