如何在 sqlite3 db.get 和 db.all 中使用 async/await?

这是我的服务器 mcve:


const express = require("express");

const app = express();

const fs = require("fs");


const dbFile = "./sqlite.db";

const exists = fs.existsSync(dbFile);

const sqlite3 = require("sqlite3").verbose();

const db = new sqlite3.Database(dbFile);


app.get("/", async (req, resp) => {

  await db.run(`INSERT INTO Times VALUES (${ Date.now() })`);

  let rows = await db.all("SELECT time FROM Times");

  console.log(rows); // The line where I console log rows

  resp.send(rows);

});


app.listen(process.env.PORT || 8080);

process.on("uncaughtException", console.log);

上面的服务器正在记录一个数据库对象,如下所示,


Database {}

每次我刷新网站时在控制台中,但我希望它记录我插入数据库的行。


我在这里做错了什么?


牧羊人nacy
浏览 203回答 2
2回答

牛魔王的故事

如果 sqlite3 不支持 async/await 那么你需要创建一个像这样的 ex 承诺的异步函数async function db_all(query){    return new Promise(function(resolve,reject){        db.all(query, function(err,rows){           if(err){return reject(err);}           resolve(rows);         });    });}然后像这样使用它await db_all("SELECT time FROM Times");对需要使用的 sqlite3 中的每个函数使用相同的方法。最好的方法是创建一个模块并覆盖您需要的所有这些方法

www说

NPM 上有几个 SQLite 包。sqlite3这是您正在使用的包。它是基于回调的,应该像这样使用:db.all("SELECT time FROM Times", function(err, rows) { });注意:该.all()函数返回数据库实例,而不是结果,因此您可以这样做:db.all(query1, (err, rows) => {}).all(query2, (err, rows) => {});。Query2 不会等待 query1 完成。sqlite这是包的包装器sqlite3,事实上,需要安装它才能运行。这是基于承诺的:const rows = await db.all("SELECT time FROM Times");更好的sqlite这是一个完全不同的包。它不像上面两个示例那样异步运行查询,而是在主线程中运行每个查询。它的作者认为这样更好(对于典型的 SQLite 工作负载)。const rows = db.prepare("SELECT time FROM Times").all();

互换的青春

以上都不是我的选择:('better-sqlite' 是 python-ballasted 包,它只是增长容器 'sqlite' 看起来像 M$ 打字稿掌握培训我使用这个不错且简单的解决方案 https://www.scriptol.com/sql/sqlite-async-await.php或者当需要事务支持并且使用额外的小包没有问题时 https://www.npmjs.com/package/sqlite-async
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript