Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript中的异步等待sqlite_Javascript_Node.js_Sqlite_Asynchronous_Async Await - Fatal编程技术网

javascript中的异步等待sqlite

javascript中的异步等待sqlite,javascript,node.js,sqlite,asynchronous,async-await,Javascript,Node.js,Sqlite,Asynchronous,Async Await,我正在看的是,它有一个名为aa sqlite的库,以便用async await替换Promissions()语法 我在npm上。async await sqlite是否还有另一个更新的语法 以下是我正在使用标准sqlite库进行的尝试: const sqlite3 = require('sqlite3').verbose(); let db = new sqlite3.Database("tmp.db") async function myfunc(db) { let sql = "SEL

我正在看的是,它有一个名为aa sqlite的库,以便用async await替换Promissions()语法

我在npm上。async await 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查询的结果?

尝试sqlite包,而不是演示中使用的sqlite3。它对async await有更好的支持。

您看到的是aa sqlite包,因为它不是npm包


你提到的编写教程的家伙只是简单地介绍了他是如何创建这个小型aa sqlite包的,它都写在tuto中,但还没有在npm上发布。

我尝试过sqlite npm包,它在splite3上实现了异步/等待,但它不是那么容易使用

一种简单的方法是创建一个小模块并简化主要的sqlite3函数

下面是我为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 ...

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

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

        resolve(row)
    })
})

console.log(res)

有了这一点,您将使
结果在回调外部同步产生
res

console.log(res1)log是什么?数据库{open:true,filename:'tmp.db',mode:65542}@Mittenchops您不能对对象使用
for..of
。请看,我认为您的包-
sqlite3
不支持
promise
async/await
语法。在ES6中,您可以使用Promise包装基于回调的函数,它本质上是一个带有状态(pending、resolved、rejected)的返回值。