sqlite NodeJS“同步”函数调用返回[对象承诺]

bpsygsoo  于 2022-11-15  发布在  SQLite
关注(0)|答案(1)|浏览(114)

我想创建一个学习NodeJS强大功能的平台,所以我安排了一个使用SQLite的Web应用程序。我想让Web应用程序显示一个随机的帖子,所以我让Web应用程序选择一个:
var post = db.run("SELECT post_name FROM posts ORDER BY RANDOM() LIMIT 3;")
当我尝试使用POST获取它的结果包含在其中的整行时:
var postrow = db.all("SELECT * FROM posts WHERE post_name = ${post}") // return object promise
如您所见,它将返回[Object Promise],这会导致数据库错误,因为没有这样命名的列。但这真的让我感到困惑,因为列是POST_NAME,POST应该是值,而不是列。我已经尝试了很多(如果不是全部)我能找到的方法,但无论如何它都会返回[Object Promise]。我正在使用NodeJS v18.2。我的完整代码是:

app.get("/home", function(req,res){
 var post1 = db.run("SELECT post_name FROM posts ORDER BY RANDOM() LIMIT 3;").then(function(value) {
  return value;
 });
 res.render(__dirname + "/public/index.html", {
  post1: post1,
  postowned: db.run(`SELECT ownedby FROM posts WHERE post_name = ${post1}`)
 })})

编辑:数据库的定义为:

dbWrapper
.open({
 filename: dbFile,
 driver: sqlite3.Database
})
.then(async dBase => {
db = dBase;

try {
  if (!exists) {
    await db.run(
      "CREATE TABLE posts ( post_name VARCHAR(20), post_text TEXT, ownedby VARCHAR(15), cdate TIMESTAMP );"
    );
  }
  console.log(await db.all("SELECT post_name from post"));
} catch (dbError) {
  console.error(dbError);
} });
ohtdti5x

ohtdti5x1#

db.rundb.all都是异步函数,所以会返回[Object Promise]。尽管如此,可以通过使用db.run的可选回调参数将值更改为实际响应,下面的代码选择一个随机POST:

var posts = []
db.run("SELECT * FROM posts ORDER BY RANDOM() LIMIT 3;", function(err, row) {
 if (row.post_name != null){ 
  // if the post name is not null then push it to posts
  posts.push({ title:row.post_name, text:row.post_text, date:row.cdate, owned:row.ownedby})
 }
})
// the columns will be available in posts as 0, 1, it goes on as more posts are selected

可以使用逗号仅选择所需的列(例如SELECT post_name, post_text FROM posts)
因为app.get是一个同步函数,并且您不能使用async调用它,所以不使用await,但它仍然可以工作,因为它不会给出承诺响应。

相关问题