You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中执行sqlite查询后外部JavaScript变量未修改如何解决?

问题原因

该问题是Node.js的异步非阻塞IO特性导致的:conn.each 是异步数据库操作方法,调用后不会等待SQL查询和遍历逻辑执行完成,就会立即往后执行后续代码。因此你写在conn.each后面的console.log(n)实际运行时间早于回调内的变量赋值逻辑,此时n还未被修改,输出的还是初始值。

解决方法
  • 方案1:使用操作完成回调处理后续逻辑
    你所用的sqlite库的conn.each方法支持传入第三个参数,即所有行遍历完成后的回调函数,所有需要用到修改后n值的逻辑都可以放到这个回调中执行:
const conn = new ConnectionFactory().connection;
let n = "Jhon";
conn.each("SELECT * FROM pilots", (err, row) => {
    n = row.name;
    console.log(n);
    console.log("--------")
}, () => {
    // 所有数据遍历完成后才会执行此处
    console.log("--------")
    console.log(n);
});
  • 方案2:封装为Promise配合async/await使用
    如果后续逻辑较多,嵌套回调可读性较差,可以把查询逻辑封装为Promise,用async/await语法让代码按同步顺序执行:
const conn = new ConnectionFactory().connection;

function getPilotName() {
    return new Promise((resolve, reject) => {
        let n = "Jhon";
        conn.each("SELECT * FROM pilots", (err, row) => {
            if (err) return reject(err);
            n = row.name;
            console.log(n);
            console.log("--------")
        }, () => {
            resolve(n);
        });
    });
}

async function main() {
    const n = await getPilotName();
    console.log("--------")
    console.log(n);
    // 后续所有用到n的逻辑都可以在这里按顺序写
}
main();

内容的提问来源于stack exchange,提问作者João Victor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 23:15:03