NodeJS SQL 服务器数据拉取不等待承诺完成

NodeJS SQL Server data pull isn't waiting for promise completion

我正在使用 Node.js 重写一个 ASPX 应用程序。此应用程序的一部分是从 SQL 服务器中的 table 提取数据。我正在使用异步函数来尝试并强制在继续之前提取数据。在下一步之前我有数据是很重要的。但是,当它 returns 来自 await 时,响应为空。

const getUserGroups = async (user) => {
    let qry = `Select role from [xxxxx] where LOWER(yyyyy)='${user.toLowerCase()}'`;
    let groups = await dataQuery.Select(qry, dbList.MCAIntranet)
    console.log("Groups: ", groups); //This is undefined
    return groups;
    // })
}

这里是 Select 函数:

const Select = async (query, database) => {
    // console.log(config[database]
    sql.connect(config[database], (err) => {
        if (err) console.log(err);
        let request = new sql.Request();
        request.query(query, (err, recordset) => {
            console.log(recordset)//displays correct data
            if (err) {
                console.log(err);
                return null
            }
            return recordset;
        })
    });
}

我正在使用 mssql 模块,但由于我是 Node 的新手,所以我不确定我的错误在哪里。

提前感谢您查看此内容。

您可以使用 Promise 对象包装您的实现,或者 return Promise.resolve(data);,并且 return Promise.reject(err):

const Select = async (query, database) => {
  return new Promise((resolve, reject) => {
    // console.log(config[database]
    sql.connect(config[database], (err) => {
        if (err) reject(err);
        let request = new sql.Request();
        
        request.query(query, (err, recordset) => {
            console.log(recordset)//displays correct data
            if (err) {
                console.log(err);
                reject(err);
            }
            resolve(recordset);
        })
    });
  });
}

在您当前的代码中,return 您的 Select 函数中没有任何内容。特别是您没有将 sql 代码包装在 promise 中。

你说,你用的是mssql包。这已经支持 async/await,因此您应该使用适当的异步调用而不是回调。

const Select = async (query, database) => {
   try {
     await sql.connect(config[database]);
     let request =  new sql.Request();
     let recordset = await request.query(query);
     return recordset;
   } catch (e) {
     console.log(e);
     return null;
   }
}

此外,您应该阅读有关参数化查询的内容,因为目前您的代码非常不安全,即它容易受到 SQL 注入和无效语法错误的影响。