NodeJS异步函数中SQLite3查询返回空数组问题排查
问题原因与解决方案
问题核心原因
NodeJS中SQLite3的db.all()是异步方法,你的getLocaties函数如果按同步逻辑返回结果,会在数据库查询完成前就返回初始的空数组;而直接调用db.all()时,回调函数会在查询完成后触发,所以能拿到正确结果。
比如典型的错误写法:
function getLocaties() { let locaties = []; db.all('SELECT * FROM locaties', (err, rows) => { if (!err) locaties = rows; }); return locaties; // 此时数据库查询还未执行完成,locaties仍是初始空数组 }
正确实现方式
1. 使用回调函数
function getLocaties(callback) { db.all('SELECT * FROM locaties', (err, rows) => { if (err) return callback(err); callback(null, rows); }); } // 调用示例 getLocaties((err, data) => { if (err) { console.error('查询出错:', err); return; } console.log('查询结果:', data); });
2. 封装为Promise
function getLocaties() { return new Promise((resolve, reject) => { db.all('SELECT * FROM locaties', (err, rows) => { if (err) reject(err); else resolve(rows); }); }); } // 调用示例 getLocaties() .then(data => console.log('查询结果:', data)) .catch(err => console.error('查询出错:', err));
3. 使用async/await(推荐,代码更简洁)
基于Promise封装,用async/await简化异步逻辑:
function getLocaties() { return new Promise((resolve, reject) => { db.all('SELECT * FROM locaties', (err, rows) => { if (err) reject(err); else resolve(rows); }); }); } // 调用时需在async函数内执行 async function fetchLocaties() { try { const data = await getLocaties(); console.log('查询结果:', data); } catch (err) { console.error('查询出错:', err); } } fetchLocaties();
关键提醒
NodeJS异步编程的核心是不要在异步操作未完成时同步返回结果,必须通过回调、Promise或async/await等待异步操作结束后,再处理并返回数据。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

