javascript - 无法等待 Node.js 中的 sqlite3.Database.get() 函数完成

标签 javascript node.js asynchronous async-await node-sqlite3

我在使用 node-sqlite3 的 node.js 中遇到一些基本的异步/等待问题。
我的目标是从 SQLite 数据库中选择一些值,检查它是否符合某些条件,并在满足条件时采取一些措施。这是代码:

const sqlite3 = require('sqlite3').verbose();
main();

async function main() {
    let ordersDb = await createDbConnection('./ProcessedOrders.db');
    var orderProcessed = await orderAlreadyProcessed(ordersDb, "555");
    console.log("orderProcessed = " + orderProcessed);
    if (!orderProcessed) {
        console.log("So condition is met!");
    }
}


async function orderAlreadyProcessed(ordersDb, orderNumberStr) {
    console.log('starting orderAlreadyProcessed function'); //DEBUG
    var result;
    var query = 'select count(SoldOrderNumber) as "recsCount" from ProcessedSoldOrders where SoldOrderNumber = ?;';
    await ordersDb.get(query
    ,[orderNumberStr]
    ,(err, row) => {
        console.log('Row with count = ' + row); //DEBUG
        console.log('row.recsCount = ' + row.recsCount); //DEBUG
        result = typeof row !== 'undefined' && row.recsCount > 0;
    });
    console.log('Returning ' + result); //DEBUG
    return result;
}

async function createDbConnection(dbFileName) {
    let db = new sqlite3.Database(dbFileName, (err) => {
        if (err) {
            console.log(err.message);
        }
    });
    return db;
}

但我得到的是进一步执行的代码,根本没有等待 Database.get() 方法!结果,这是我在控制台中看到的打印内容:

starting orderAlreadyProcessed function
Returning undefined
orderProcessed = undefined
So IF condition met!
Row with count = [object Object]
row.recsCount = 1

如我们所见,我们过早地从 orderAlreadyProcessed 返回,返回值 = 'undefined'。因此满足条件,采取行动,然后 Database.get() 返回。但如果适当等待,则不会满足条件。

如何让它等待结果值?

最佳答案

因为你想使用async/await,所以node-sqlite3 (sqlite3)库不支持 Promise API,你需要使用 node-sqlite (sqlite)库,它是 sqlite3 的包装器,并添加了对 Promise API 的支持。然后,您的代码将如下所示:

const sqlite3 = require('sqlite3');
const { open } = require('sqlite');

async function main() {
    try {
        sqlite3.verbose();
        const ordersDb = await createDbConnection('./ProcessedOrders.db');
        const orderProcessed = await orderAlreadyProcessed(ordersDb, "555");
        console.log("orderProcessed = " + orderProcessed);
        if (!orderProcessed) {
            console.log("So condition is met!");
        }
    } catch (error) {
        console.error(error);
    }
}


async function orderAlreadyProcessed(ordersDb, orderNumberStr) {
    try {
        console.log('Starting orderAlreadyProcessed function');
        const query = 'SELECT COUNT(SoldOrderNumber) as `recsCount` from ProcessedSoldOrders where SoldOrderNumber = ?;'
        const row = await ordersDb.get(query, [orderNumberStr]);
        console.log('Row with count =', row);
        console.log('row.recsCount =', row.recsCount);
        const result = typeof row !== 'undefined' && row.recsCount > 0;
        console.log('Returning ' + result);
        return result;
    } catch (error) {
        console.error(error);
        throw error;
    }
}

function createDbConnection(filename) {
    return open({
        filename,
        driver: sqlite3.Database
    });
}

main();

我特意没有去掉你的console.log等部分代码,以免混淆你程序原有的逻辑。

关于javascript - 无法等待 Node.js 中的 sqlite3.Database.get() 函数完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62456867/

相关文章:

javascript - 我可以用 onclick=return false 触发链接上的点击事件吗

javascript - 在 AngularJS 中,哪些模块可以覆盖常量?

javascript - 无法使用 MEAN 堆栈显示图像

javascript - 如何从 Node.js 服务器将函数传递给客户端

unit-testing - 是否有一个模块可以轻松模拟 req/res 对象以对连接样式处理程序进行单元测试?

objective-c - 下面的 URLConnection 出了什么问题?

javascript - 是否所有 javascript 调用都适用于混合 Android 应用程序?

javascript - ng-click on addClass 事件只会在第二次单击按钮时触发

asynchronous - 如何在Rust中编写两个异步函数

java - 如何保存 Vert.x WebClient 结果并在方法中返回它