返回函数有问题,为什么函数返回未定义

问题描述 投票:0回答:1

返回函数的问题,这个函数大多数返回 true 或 false 但它返回 undefined ,有人可以帮忙吗?

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 但其返回未定义

javascript function return
1个回答
0
投票

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();
© www.soinside.com 2019 - 2024. All rights reserved.