这是我的服务器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 {}
每次刷新网站时都会在控制台中显示,但我希望它记录我插入数据库的行。
我在这里做错了什么?
NPM上有几个SQLite包。
sqlite3
这是您正在使用的程序包。它是基于回调的,应该这样使用:
db.all("SELECT time FROM Times", function(err, rows) { });
注意:.all()
函数返回数据库实例,而不是结果,因此可以执行以下操作:db.all(query1, (err, rows) => {}).all(query2, (err, rows) => {});
。查询2不会等待查询1完成。
硅铝石
这是sqlite3
包的包装器,事实上,需要安装它才能正常工作。基于承诺:
const rows = await db.all("SELECT time FROM Times");
更好的sqlite
这是一个完全不同的包裹。它不像上面两个例子那样异步运行查询,而是在主线程中运行每个查询。它的作者认为这是更好的(对于典型的SQLite工作负载(。
const rows = db.prepare("SELECT time FROM Times").all();
如果sqlite3不支持async/await,那么您需要创建一个具有如下承诺的异步函数e.x.
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中需要使用的每个函数使用相同的方法。
最好的方法是创建一个模块并覆盖所有这些需要的方法
以上都不是我的选择:(
"better sqlite"是一个python压载包,它只是增加容器"sqlite"看起来像M$typescript掌握培训
我用这个漂亮的&简单解决方案https://www.scriptol.com/sql/sqlite-async-await.php
或者当需要交易支持并且额外的小程序包没有问题时https://www.npmjs.com/package/sqlite-async