Возврат функции не печатается в консоли

#javascript #node.js #function

#javascript #node.js #функция

Вопрос:

У меня есть этот фрагмент кода, в котором я пишу node.js , и у меня есть проблема.

 async function CheckearWhitelist(id) {
  const oracheck = ora("Checkeando en la whitelist...").start();
  con.connect(function (err) {
    if (err) {
      oracheck.fail(
        "Ha habido un fallo al conectarse a MySQL - Comprueba la conexión"
      );
    }
    con.query(
      `SELECT * FROM `whatsapp`.`whitelist` WHERE `contacto` = '${id}'`,
      function (err, result, fields) {
        if (err) {
          oracheck.fail("Fallo de MySQL");
        } else if (result == []) {
          oracheck.warn("Usuario no encontrado en la whitelist");
          return false
        } else {
          date = new Date();
          horas_fecha = date.getHours();
          minutos = date.getMinutes();
          hora = `${horas_fecha}.${minutos}`;

          hora_desb = result[0].hora_desbloqueo;
          if (hora_desb == 0) {
            oracheck.info("El contacto está en la whitelist indefinidamente");
            return true
          } else if (hora_desb <= hora) {
            oracheck.warn("Usuario no encontrado en la whitelist");
            return false
          } else {
            oracheck.succeed("Resultado Encontrado: ");
            return true
          }
        }
      }
    );
  });
}

CheckearWhitelist("34676654601@c.us").then((value) => console.log(value));
 

Дело в том, что если я создаю console.log(true / false), а не возврат, он отлично работает. Но когда я возвращаю true / false и создаю консоль.журнал при вызове функции, она не работает. Я надеюсь, что кто-нибудь сможет мне помочь. Спасибо

Комментарии:

1. В вашем коде есть несколько проблем, на которые указывают другие комментаторы. Я бы просто добавил одну дополнительную проблему: вы используете CheckearWhitelist функцию как async функцию, но на самом деле это не async функция, поскольку она не возвращает a Promise .

Ответ №1:

Проблема в том, что любое возвращаемое значение из имеющейся у вас асинхронной функции не будет возвращено обратно, как вы ожидаете (оно будет отброшено или использовано библиотекой, но не вашим кодом)

Вместо этого вы должны вернуть новый объект Promise на верхнем уровне и разрешить его внутри обратного вызова, когда вы хотите «вернуть» значения.

 function CheckearWhitelist(id) {
  return new Promise((resolve, reject) => {
    const oracheck = ora("Checkeando en la whitelist...").start();
    con.connect(function(err) {
      if (err) {
        oracheck.fail(
          "Ha habido un fallo al conectarse a MySQL - Comprueba la conexión"
        );
      }
      con.query(
        `SELECT * FROM `whatsapp`.`whitelist` WHERE `contacto` = '${id}'`,
        function(err, result, fields) {
          if (err) {
            oracheck.fail("Fallo de MySQL");
          } else if (result == []) {
            oracheck.warn("Usuario no encontrado en la whitelist");
            resolve(false)
          } else {
            date = new Date();
            horas_fecha = date.getHours();
            minutos = date.getMinutes();
            hora = `${horas_fecha}.${minutos}`;

            hora_desb = result[0].hora_desbloqueo;
            if (hora_desb == 0) {
              oracheck.info("El contacto está en la whitelist indefinidamente");
              resolve(true)
            } else if (hora_desb <= hora) {
              oracheck.warn("Usuario no encontrado en la whitelist");
              resolve(false)
            } else {
              oracheck.succeed("Resultado Encontrado: ");
              resolve(true)
            }
          }
        }
      );
    });
  })
}

CheckearWhitelist("34676654601@c.us").then((value) => console.log(value));