我想创建一个学习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);
} });
1条答案
按热度按时间ohtdti5x1#
db.run
和db.all
都是异步函数,所以会返回[Object Promise]。尽管如此,可以通过使用db.run
的可选回调参数将值更改为实际响应,下面的代码选择一个随机POST:可以使用逗号仅选择所需的列(例如
SELECT post_name, post_text FROM posts
)因为
app.get
是一个同步函数,并且您不能使用async
调用它,所以不使用await
,但它仍然可以工作,因为它不会给出承诺响应。