我试图在一页中显示两个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函数?
答案 0 :(得分:1)
这里最干净的方法是使用 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
包装器。
答案 1 :(得分:0)
我发现了这样的解决方法,但我真的不认为这是唯一,可行且优雅的方法:
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
});
});
});