如何在mssqlnodev8的SQL查询代码块外部获取返回值?
解决方法
你的问题核心是**await对回调风格的sql.query不起作用**——回调函数是异步执行的,当代码走到console.log(test)时,回调还没跑完,所以test还是初始的空字符串。另外,你手动替换单引号的防注入方式存在风险,应该用mssql自带的参数化查询来处理。
下面是修正后的代码:
const transformTable = async (field, value) => { try { // 改用参数化查询,彻底避免SQL注入 const query = `SELECT XXX FROM XXXTable WHERE fieldName = @field AND adpName = @value`; // 使用Promise风格的sql.query,await会等待查询完成 const result = await sql.query(connectionString, { query: query, parameters: { field: { type: sql.VarChar, value: field }, value: typeof value === 'boolean' ? { type: sql.Bit, value: value } : { type: sql.VarChar, value: value } } }); // 直接返回查询结果,外部调用时用await接收 console.log(result, '查询结果'); return result; } catch (error) { console.error('查询出错:', error); // 抛出错误让调用方处理,或返回默认值 throw error; } }
关键修改点:
- 去掉回调函数,改用
mssql的Promise兼容写法,await能正确等待查询完成 - 用
@field、@value占位符实现参数化查询,替代字符串拼接,既安全又无需手动转义单引号 - 直接返回查询结果,外部调用该函数时,需要用
await transformTable(...)来获取值
如果你的mssql版本支持自动推断参数类型,也可以用更简洁的写法:
const result = await sql.query(connectionString, query, { field: field, value: value });
外部调用示例:
async function useTransform() { try { const transformedValue = await transformTable('someField', 'someValue'); console.log('外部拿到的结果:', transformedValue); } catch (err) { // 处理错误逻辑 } }
内容的提问来源于stack exchange,提问作者brianw921
相关产品推荐
相关产品推荐

