![](/img/trans.png)
[英]Node.js & Express.js/Jade res.render returns res.render is not a function
[英]Render results of two different queries at the same time in Node.js res.render
我試圖在一頁中顯示兩個SQL查詢的結果。 我的代碼在module.exports塊中,整個應用程序用Node.js Express編寫。 這將返回錯誤“無法讀取未定義的屬性'length'”。
var message = "some random text";
var res_points, res_types;
db.query(query, (err, result) => {
if (err) {
res.redirect('/');
}
res_points= result;
});
db.query(query2, (err, result) => {
if(err) {
res.redirect('/');
}
res_types = result;
});
res.render('index.ejs', {
title: message,
,points: res_points
,types: res_types
});
當我這樣做時,它可以工作:
db.query(query, (err, result) => {
if (err) {
res.redirect('/');
}
res.render('index.ejs', {
title: message,
points: result
});
});
我究竟做錯了什么? 或者更好的說,如何將這兩個查詢的結果傳遞給render函數?
我發現了這樣的解決方法,但我真的不認為這是唯一,可行且優雅的方法:
let res_points, res_types;
db.query(query, (err, result) => {
if (err) {
res.redirect('/');
}
db.query(query2, (err2, result2) => {
if(err2) {
res.redirect('/');
}
res.render('index.ejs', {
title: "Welcome to Hamburg Map | View Points"
,points: result
,types:result2
});
});
});
這里最干凈的方法是使用Promises & Promise.all
。 為此,您需要將db.query
包裝在Promise
。
// You can use Util.promisify too
const queryWrapper = (statement) => {
return new Promise((resolve, reject) => {
db.query(statement, (err, result) => {
if(err)
return reject(err);
resolve(result);
});
});
};
app.get('/some-route', (req, res, next) => {
const message = "some random text";
Promise.all([
queryWrapper(query),
queryWrapper(query2)
])
.then(([points, types]) => {
res.render('index.ejs', {
title: message,
points,
types
});
})
.catch(err => {
console.error(err);
res.redirect('/');
})
});
注意 :如果您使用的是MySQL,則mysql2
軟件包提供了promise支持,因此您可以避免Promise
包裝器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.