如何在Node.JS中“包装”具有多个结果的响应

时间:2018-08-16 00:24:25

标签: mysql node.js json

我需要设置一个路由,该路由能够从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;
}

我需要用不同的查询结果“重建”答案。欢迎大家的帮助!

1 个答案:

答案 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之类的东西或其他软件包,我相信应该有很多。