我想創建一個平臺來學習 NodeJS 的強大功能,所以我安排了一個使用 SQLite 的 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}`)
})})
編輯: db 的定義是:
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);
} });
uj5u.com熱心網友回復:
db.run并且db.all都是異步函式,因此它們將回傳 [object Promise]。盡管如此,可以使用可選的回呼引數將值更改為實際回應db.run,下面的代碼選擇一個隨機帖子:
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,所以 this 不使用await,但這仍然可以作業,因為它不會給出承諾回應。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/511667.html
上一篇:如何找到最近的時間?
