【问题标题】:Async await sqlite in javascriptjavascript中的异步等待sqlite
【发布时间】:2019-10-01 00:45:49
【问题描述】:

我正在查看this tutorial,它有一个名为 aa-sqlite 的库,以便用 async-await 替换 Promises() 语法。

我在 npm 上是 not seeing aa-sqlite。是否有另一种更新的异步等待 sqlite 语法?

这是我正在尝试使用标准 sqlite 库:

const sqlite3 = require('sqlite3').verbose();
let db = new sqlite3.Database("tmp.db")

async function myfunc(db) {
  let sql = "SELECT id id FROM TABLE LIMIT 2"
  let res1 = await db.run(sql)
  console.log(res1)
  for (row of res1) {
    console.log(row);   
  }

但这会产生

TypeError: res1 is not iterable

我不希望 res1 成为对象,而是结果的迭代器。如何在 ES7/ES8 中异步/等待 db.run 查询的结果?

【问题讨论】:

  • console.log(res1) 记录了什么?
  • 数据库 { 打开:true,文件名:'tmp.db',模式:65542 }
  • @Mittenchops 您不能将for ..of 用于对象。见developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 我认为你的包 - sqlite3 不支持 promiseasync/await 语法。在 ES6 中,您可以使用 Promise 包装基于回调的函数,它本质上是带有状态(待处理、已解决、已拒绝)的返回值。

标签: javascript node.js sqlite asynchronous async-await


【解决方案1】:

我尝试了 sqlite npm 包,它通过 splite3 实现了 async/await,但它并不那么容易使用。

一个简单的方法是创建一个小模块并将主要的 sqlite3 功能进行 promessify。

这是我为 Discord 聊天机器人数据库创建的简单模块:

const sqlite3 = require('sqlite3');
const util    = require('util');

let db = new sqlite3.Database('./db/chatbot.sqlite3', sqlite3.OPEN_READWRITE, (err) => {
    if (err) {
        console.error(err.message);
    }
    console.log('Connected to the chatbot database.');
});

db.run = util.promisify(db.run);
db.get = util.promisify(db.get);
db.all = util.promisify(db.all);

// empty all data from db
db.clean_db = async function() {
  await db.run("delete from users");
  await db.run("delete from members");
  await db.run("delete from guilds");
  db.run("vacuum");
}

// any kind of other function ...

// and then export your module

module.exports = db;

如何使用 - 现在您可以在代码中使用这样的模块:

const db = require('./db');

// get one user
const myUser = await db.get("select * from users where id = ?", [id]);
if (! myUser)
    return console.log("User with id", id, "not found");

// get all users
const users = await db.all("select * from users");
users.map((user) => { console.log(user.id, "/", user.name); });

// ... etc ...

【讨论】:

    【解决方案2】:

    对我来说,最简单的解决方案是将操作封装在 Promise 中,如下所示:

    const res = await new Promise((resolve, reject) => {
        db.each('SELECT id FROM table', [], (err, row) => {
            if (err)
                reject(err)
    
            resolve(row)
        })
    })
    
    console.log(res)
    

    有了这个,row 将在回调之外同步地在res 中得到结果。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        您注意到看到 aa-sqlite 包,因为它不是 npm 包。

        编写您所指的教程的人只是简单地介绍了他是如何创建这个小的 aa-sqlite 包的,并且它都写在 tuto 中,但尚未在 npm 上发布。

        【讨论】:

          猜你喜欢
          • 2018-07-01
          • 1970-01-01
          • 2016-02-11
          • 2019-05-10
          • 1970-01-01
          • 1970-01-01
          • 2021-11-18
          • 2022-09-30
          • 2019-10-21
          相关资源
          最近更新 更多