Return 使用打字稿 sql 查询后的布尔值

Return a boolean after a sql query with typescript

这是我的功能:

static async isExiste (email: string) {
        const bdd = mysql.createConnection({
            host: process.env.DB_HOST,
            user: process.env.DB_USER,
            password: process.env.DB_PASS,
            database: process.env.DB_DATABASE,
            socketPath: process.env.SOCKETPATH,
            port: parseInt((process.env.PORTMYSQL === undefined) ? '3306' : process.env.PORTMYSQL)
        })
        const emailExist = `SELECT 1 FROM user WHERE email='${email}'`
        let bool = false
        await bdd.query(emailExist, (err, result) => {
            if(result[0]) {
                bool = true
                console.log(bool)
            } else {
                bool = false
                console.log(bool)
            }
        })
        console.log('boolean renvoyé: ', bool)
        return bool
    }

这是控制台的 return :

boolean renvoyé:  false
true

函数的return本应为真却为假。 我不明白为什么 sql 请求没有阻止脚本。

bdd.query() 没有 return 承诺,并且您的 console.log() 和 return 语句在查询回调之外,这意味着它们发生在调用回调之前。您可以通过 return 承诺然后用您的 return 值解决承诺来解决这个问题。将您的代码修改为如下所示应该可行:

static isExiste (email: string) {
  return new Promise((resolve, reject) => {
    const bdd = mysql.createConnection({
      host: process.env.DB_HOST,
      user: process.env.DB_USER,
      password: process.env.DB_PASS,
      database: process.env.DB_DATABASE,
      socketPath: process.env.SOCKETPATH,
      port: parseInt((process.env.PORTMYSQL === undefined) ? '3306' : process.env.PORTMYSQL)
    })
    const emailExist = `SELECT 1 FROM user WHERE email='${email}'`
    bdd.query(emailExist, (err, result) => {
      if (err) {
        reject(err);
        return;
      }

      const bool = !!result[0];
      console.log('boolean renvoyé: ', bool)
      resolve(bool)
    })
  });
}