我目前正在开发一个小型的看板应用程序,为我自己的目的和后端是基于typescript(我是一个新手在TS TBH)和一个简单的sqlite3数据库。因此,目前我试图从数据库中获取数据,我有很多问题与这些承诺返回。
一张table看起来像那样
CREATE TABLE "board" (
"id" INTEGER NOT NULL UNIQUE,
"name" TEXT NOT NULL UNIQUE,
"position" INTEGER NOT NULL UNIQUE,
PRIMARY KEY("id")
)
我的问题是:
SELECT name FROM board ORDER BY position
所以现在我把这个字符串给我的异步函数,它返回一个promise,我试图从函数中得到一个董事会标题的列表-看起来像这样:
import { Database } from "sqlite3";
function dbQuery() {
const db = new Database('./data.sqlite3');
return new Promise( resolve => db.serialize(() => {
var result = [];
db.all("SELECT name FROM board ORDER BY position", (err, rows) => {
rows.forEach(function (row) {
//console.log(row['name']);
result.push(row['name']);
});
});
console.log(result);
resolve(result);
})
)
}
async function testFunc() {
let res = await dbQuery();
console.log(res);
}
testFunc();
有人知道为什么数组res在末尾总是空的吗?注解语句console.log(row ['name ']打印出正确的数据…
SQLITE3使用纯JS可能更好吗?(也许使用更好的sqlite3或类似的东西与JS,而不是sqlite3与TS?)或者使用另一个数据库框架更好?
我像每一个TS Sqlite3文档一样搜索和阅读,但似乎TS和SQLite3并不是那么常见的组合。
1条答案
按热度按时间2eafrhcq1#
您将立即(同步)调用
resolve
,而为您提供rows
的回调将 * 稍后 * 运行,即:异步也许你认为
serialize
会阻止JavaScript的执行,直到查询结果进来,但这不是它的工作方式:serialize()
将立即返回。serialize
的目的不是阻止JavaScript的执行,而是保证 "...一次最多只能有一个语句对象执行一个查询"(docs)。您仍然可以异步地获得结果。在您的示例中,使用serialize
没有任何优势,因为您只执行一条SQL语句。您应该在执行回调时调用
resolve
--给.all()
的回调。所以把它移到那里。其他评论:
.map()
代替.forEach()
+.push()
err
参数,看看是否有错误,在这种情况下,拒绝带有错误的promiseserialize
Package 器。