我需要设置一个路由,该路由能够从3个或4个不同的表中返回数据,并且需要以特定的方式“格式化” JSON响应。例如,在PHP中,这就是我所需要的:
$query1 = 'select * from bananas';
$query2= 'select * from lettuces where id_potato = id_banana';
$response = [
'name' => $query1->name,
'phone' => $query1->phone,
'groups' => $query2
];
请注意,“组”包含$ query2,这是一个数组。
到目前为止,这里是我的控制器:
module.exports = app => {
app.get('/api/public/fotos/:login', (req,res) => {
let login = req.params.login;
let connection = new app.connection.connectionFactory();
let fotosDao = new app.models.FotosDao(connection);
fotosDao.getTimeline(login, function(error, response) {
if(error) {
console.log('Erro ao obter a timeline: ' + error);
res.status(500).send(error);
} else {
res.status(200).send(response);
}
});
});
}
还有我的DAO:
function FotosDao(connection) {
this._connection = connection;
}
FotosDao.prototype.getTimeline = function(login, callback) {
this._connection.query(`
SELECT *
FROM foto a
INNER JOIN usuario b ON a.usuario_id = b.id
WHERE b.login = ?`,
login, callback);
}
module.exports = function() {
return FotosDao;
}
我需要用不同的查询结果“重建”答案。欢迎大家的帮助!
答案 0 :(得分:1)
您可以为每个查询创建一个Promise
,然后用chain
.then
进行创建,也可以nest
然后通过callbacks
在另一个查询下进行创建。 Promise方法的示例:
我假设您希望getTimeline
为您提供该结果,所以:
FotosDao.prototype.getTimeline = (login) =>
yourQ1().then(resultQ1 =>
yourQ2().then(resultQ2 =>
yourQ3().then(resultQ3 =>
// compose your result object
return {
name: resultQ1,
phone: resultQ2,
groups: resultQ3
}
)
)
)
}
一种更优雅的方式涉及Promise.all():
Promise.all([yourQ1, yourQ2, yourQ3]).then(function(values) {
composeYourResult(values);
});
此处的关键是“保证”查询的质量,以便您可以链接/处理它们的结果并更好地处理它们的异步执行。现在,您可以为mysql查询做自己的Promise处理程序,也可以使用promise-mysql之类的东西或其他软件包,我相信应该有很多。