SQLite循环中如何拼接值返回单字符串?Node调用sqlite3时变量为空如何解决?
问题原因
- sqlite3 模块的
db.each()是异步非阻塞方法,调用后不会等待SQL查询执行、行遍历完成才往下走,而是直接执行后续的return语句。此时遍历行的回调还没触发,变量r还保持初始的空值,所以返回的结果里拼接内容为空。
解决方案
把异步操作用Promise封装,等所有行遍历拼接完成后再返回结果,调用时用async/await或者then方法接收结果即可:
const sqlite3 = require('sqlite3').verbose(); let db = new sqlite3.Database('./data.db'); exports.getNav = function () { return new Promise((resolve, reject) => { let r = ""; db.each( `SELECT * FROM sites`, // 单条行数据处理回调 (err, row) => { if (err) return reject(err); r += `<a href="${row.url}">${row.icon}${row.name}</a>`; }, // 所有行遍历完成后的回调 (err, count) => { if (err) return reject(err); resolve(`<nav class="nav-left">${r}</nav>`); } ); }); };
调用示例:
// async/await 方式调用 async function render() { const navHtml = await getNav(); // 后续使用navHtml的逻辑 } // then 方式调用 getNav().then(navHtml => { // 后续使用navHtml的逻辑 }).catch(err => { console.error('导航数据查询失败', err); })
内容的提问来源于stack exchange,提问作者powersrob
相关产品推荐
相关产品推荐

