gpt4 book ai didi

javascript - Node JS 中的内部类函数使用抛出错误

转载 作者:行者123 更新时间:2023-11-30 15:51:21 25 4
gpt4 key购买 nike

我正在学习 Node JS,我正在学习如何在 Node 中创建 OOP 结构。我有一个简单的类,我在其中使用函数在数据库中检查和创建用户。当我在函数内部调用类函数时出现 TypeError。我的类(class)代码,

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 结合使用?

谢谢

最佳答案

因为看起来你使用的是 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 的每个方法中执行此操作。

关于javascript - Node JS 中的内部类函数使用抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39280028/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com