首页 > 解决方案 > 使用节点中的异步等待从数据库响应构造一个数组

问题描述

我正在尝试使用 async await 语法构造一组数据库响应。

我知道,由于 async await 只是一种以更好的语法包装承诺的方式,因此将此处给出的面向承诺的指令转换为该格式应该很容易。

这是我所拥有的:

const sqlite3 = require('sqlite3').verbose();
const express = require('express')
const bodyParser = require("body-parser")


async function getDB(dbname) {
    let db = new sqlite3.Database(dbname)
    return db;
}

app.get('/', async (req,res) => {
    let db = await getDB(dbname)
    let r = await db.serialize(() => {
        let results = []
        db.each(`SELECT * FROM MyTable LIMIT 3`, (err, row) => {
            if (err) {
              console.error(err.message);
            }
            let m = row.id;
            console.log(m);
            results.push(m)
            });
        return results
    });
    res.send(await r)
})

app.listen(port, ipaddr);

当我调用它时,响应是:

{"open":false,"filename":"dbname.db","mode":65542}

但我希望:

[1,2,3]

发生了什么事,我该如何解决?

在控制台中,我可以看到正在检索记录:

[
  1,
  2,
  3
]  # this is exactly the thing I want returned!  Why can't I retrieve it?

所以我知道数据库调用确实有效,但我似乎无法让它们/进入/任何我可以摆脱等待的对象。

标签: node.jssqliteasync-await

解决方案


试试sqlite 包,而不是演示中使用的sqlite3 。它对异步等待有更好的支持。


推荐阅读