ノード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をオブジェクトを使用する必要が ノードに簡単に十分なプロトタイプを使用することができるはず
おかげ
'this.userNameCheck();を呼び出すと、間違った' this'が使用されます。あなたは別の関数でそれを呼び出しているので、コンテキストがあなたのクラスを指していません。 – vlaz
関数を呼び出すために 'this'を使わないとどうすれば使えますか? –