在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函数中?

这里最干净的方法是使用Promises&CCD_ 1。为此,您需要将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包装器。

我找到了这样的解决方法,但我真的不认为这是唯一正确和优雅的方法:

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
});
});
});

最新更新