Экспресс : асинхронно, ожидание : Не удается получить доступ к «результату» до инициализации

#javascript #sql-server #api #rest #express

Вопрос:

Функция входа в систему использует функцию ExecuteSQL, которая используется для проверки наличия пользователя? При запуске этого файла я получаю следующую ошибку. асинхронное ожидание.

Ошибка ссылки: Не удается получить доступ к «результату» до инициализации в /Пользователи/naseefali/Документы/Проекты/common_express_api/данные/DL.js:100:25 при асинхронном входе в систему (/Пользователи/naseefali/Документы/Проекты/common_express_api/данные/DL.js:99:24) ВЫБЕРИТЕ fUserPwd ИЗ tblUser, ГДЕ fUserID = «АДМИНИСТРАТОР» {наборы записей: [ [ [Объект]]], набор записей: [ { fUserPwd: ‘006060061500675006630067300667’}], вывод: {}, Измененные строки: [ 1 ] }

Код

 async function testConnection() {
    try {

        const pool = await getConnection();
        if (pool) {
            const result = await pool.request()
                .query('SELECT * FROM tblUser', function (err, sqlResult) {
                    if (err) {
                        console.log(err);
                    }
                    else {
                        console.log(sqlResult);
                    }
                });
        }
        else console.log(pool);
    } catch (err) {
        console.log(err);
    }
};

async function ExecuteSQL(strSQL) {
    try {
        const pool = await getConnection();
        if (pool) {
            const result = await pool.request()
                .query(strSQL, async function (err, sqlResult) {
                    if (err) {
                        console.log(err);
                    }
                    else {
                        console.log(strSQL);
                        console.log(sqlResult);
                        return sqlResu<
                    }
                });
        }
        else console.log(pool);
    } catch (err) {
        console.log(err);
    }
};


async function login(strUID) {
    const strSQL = `SELECT fUserPwd FROM tblUser WHERE fUserID ='${strUID}'`;
    try {
        const result = await ExecuteSQL(strSQL).then(await function () {
            console.log(result);
        });
    } catch (err) {
        console.log(err);
    }

};

login('ADMIN');
 

Ответ №1:

потому что тогда вы не вернули значение и не получили доступ к результату перед его назначением

  async function login(strUID) {
    const strSQL = `SELECT fUserPwd FROM tblUser WHERE fUserID ='${strUID}'`;
    try {
        const result = await ExecuteSQL(strSQL).then(await function () {
            console.log(result);
        });
    } catch (err) {
        console.log(err);
    }

 };
 

попробуйте изменить его на

  const result = await ExecuteSQL(strSQL).then(function (data) {
  return data
 });
 console.log(result);
 

или просто

  const result = await ExecuteSQL(strSQL);
 console.log(result);
 

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

1. с помощью : const результат = ожидание ExecuteSQL(strSQL); console.log(результат); он все еще не определен..

2. с : const результат = ожидание ExecuteSQL(strSQL).затем(функция (данные) { возвращаемые данные }); console.log(результат); все еще не определено

3. извините, я не указал, что в функции ExecuteSQL что-то не так, внутри этой функции вам нужно вернуть результат, вы можете взглянуть на ответ Назифа Али

Ответ №2:

здесь я просто возвращаю что-либо из ExecuteSQL.

Я сделал

 async function ExecuteSQL(strSQL) {
    try {
        const pool = await getConnection();
        //you don't need to check for the pool, because getConnection() will throw if there is an error 
        const result = await pool.request().query(strSQL);
        return resu<
    } catch (err) {
        console.log(err);
    }
};


async function login(strUID) {
    const strSQL = `SELECT fUserPwd FROM tblUser WHERE fUserID ='${strUID}'`;
    try {
        const result = await ExecuteSQL(strSQL);
        console.log(result);
        return resu<
    } catch (err) {
        console.log(err);
    }

};