Node.js调用Snowflake查询函数返回undefined问题求助
Node.js调用Snowflake查询返回undefined的解决办法
你的代码核心问题是**connection.execute的回调逻辑与await不兼容**:
- 你用
await等待connection.execute的返回值,但该方法是回调驱动的,不会返回Promise,导致snow_data始终为undefined。 - 回调函数里的
return rows仅在回调内部生效,无法传递到外层的snow_data变量。
修复方案1:用Promise包装回调逻辑
将回调风格的查询转换为Promise,让await能正确捕获结果:
async function getSnowData() { return new Promise((resolve, reject) => { connection.execute({ sqlText: 'SELECT * from snow_tbl;', complete: function(err, stmt, rows) { if (err) { reject(err); // 将错误抛出给外层catch处理 } else { resolve(rows); // 将查询结果传递给await } } }); }); } app.get("/snowdata", async (req, res) => { try { const snow_data = await getSnowData(); console.log(snow_data); res.send(snow_data); // 向前端返回查询结果 } catch (error) { console.error('Error in main process:', error.message); res.status(500).send(error.message); // 错误时返回500状态码 } });
修复方案2:使用Snowflake SDK的Promise风格调用
若你的Snowflake Node.js SDK是较新版本,execute方法本身支持Promise(无需回调),可直接简化代码:
async function getSnowData() { // 直接await execute的Promise返回值,根据SDK结构提取rows const result = await connection.execute({ sqlText: 'SELECT * from snow_tbl;' }); return result.rows; // 部分SDK可能直接返回rows,需根据实际结构调整 } app.get("/snowdata", async (req, res) => { try { const snow_data = await getSnowData(); console.log(snow_data); res.json(snow_data); // 用JSON格式返回更规范 } catch (error) { console.error('Error in main process:', error.message); res.status(500).json({ error: error.message }); } });
内容的提问来源于stack exchange,提问作者Okr100
相关产品推荐
相关产品推荐

