javascript中的异步等待sqlite
我正在看的是,它有一个名为aa sqlite的库,以便用async await替换Promissions()语法 我在npm上。async await sqlite是否还有另一个更新的语法 以下是我正在使用标准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
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)的返回值。