class Admin(){
//function check if the username alredy used ,, error in return of function
checkUserNameIsUsed(userName,tableName,proprtieName){
try {
let sqlQuery=`select * from ${tableName} where ${proprtieName} = '${userName}'`;
connectToMysql();
connection.connect((err)=>{
if(!err){
connection.query(sqlQuery,(err,result)=>{
if(!err){
if(result.length>0){
console.log("this user name is used :" , userName);
return false;
}
else{
return true;
}
}
connection.end();
})
}
else{
console.log(err);
connection.end();
return false;
}
})
} catch (error) {
console.log(error);
}
}
}
在上面的代码中,我尝试检查数据库是否已经有用户名,如果函数找到用户名,它最返回 false,如果没有找到,则返回 true。
在这段代码中我检查函数是否返回 false 或 true 但其返回未定义
checkUserNameIsUsed 函数正在进行数据库查询,这是一个异步操作。当您尝试在回调函数内返回 true 或 false 时,您实际上是从这些内部函数返回,而不是从 checkUserNameIsUsed 函数本身返回。
要在这里解决这个问题,您可以使用回调或承诺。
class Admin {
//function check if the username already used ,, error in return of function
async checkUserNameIsUsed(userName, tableName, propertyName) {
try {
let sqlQuery = `SELECT * FROM ${tableName} WHERE ${propertyName} = '${userName}'`;
await connectToMysql();
return new Promise((resolve, reject) => {
connection.query(sqlQuery, (err, result) => {
if (err) {
console.log(err);
connection.end();
reject(err);
} else {
if (result.length > 0) {
console.log("This username is already used:", userName);
connection.end();
resolve(false);
} else {
connection.end();
resolve(true);
}
}
});
});
} catch (error) {
console.log(error);
throw error;
}
}
}
现在你可以使用这样的功能了
async function someFunction() {
const admin = new Admin();
try {
const isUserNameUsed = await admin.checkUserNameIsUsed('someUserName', 'tableName', 'propertyName');
console.log(isUserNameUsed); // It will log either true or false
} catch (error) {
console.error("Error occurred:", error);
}
}
someFunction();