mysql - 如何将各种 MySQL 查询结果合并到单个 JSON 对象中

标签 mysql json node.js express

我正在尝试在 NodeJS 中编写 REST API 集以从 MySQL 数据库检索数据。

代码如下:

var express = require('express');
var mysql = require('mysql');


var app = express();
var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'root',
  password : 'root',
  database : 'apitest',
  port     : '3306',
  multipleStatements: true
});


app.use(function(req, res, next) {

    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    next();

});

app.get('/users', function(req, res) {

    connection.query('SELECT name, surname, address FROM users', function(err, results) {
        if (err) throw err;
        if (results) {
            res.status(200).send(results);
        };
    });
});

app.get('/users/:userId', function (req, res) {

    var userId = req.params.userId;

    connection.query('SELECT * FROM users WHERE idUser = ?', [userId], function(err, result) {
        if (err) throw err;
        if (result) {
            res.status(200).send(result);
        };
    });

});

app.get('/users/:userId/photos', function (req, res) {

    var userId = req.params.userId;

    connection.query('SELECT date, file, tags FROM photos WHERE idUser = ?', [userId], function(err, results) {
        if (err) throw err;
        if (results) {
            res.status(200).send(JSON.stringify(results));
        }
    });

});

var server = app.listen(8080, function () {

    var host = server.address().address;
    var port = server.address().port;

    console.log('Listening on http://%s:%s', host, port);

});

如果我使用上面写的单个 REST 调用,一切都会顺利。 问题是我希望它以不同的方式工作,因此当我调用 /users/:userId 时,我想在单个结构良好的 JSON 响应中检索用户数据和相关照片。

例如:

{
    "name" : "John",
    "surname" : "Doe",
    "photos" : [
        {
            "date" : "2015-04-19T22:00:00.000Z",
            "file" : "photo1.jpg",
            "tags" : "holidays, 2015"
        },
        {
            "date" : "2015-04-19T22:00:00.000Z",
            "file" : "photo2.jpg",
            "tags" : "holidays, 2015, nassau"
        }
    ]
}

我通过修改上面提到的 /users/:userId 调用找到了解决方法:

app.get('/users/:userId', function (req, res) {

    var userId = req.params.userId;

    connection.query('SELECT * FROM users WHERE idUser = ?', [userId], function(err, results1) {
        if (err) throw err;
        if (results1) {

            connection.query('SELECT date, file, tags FROM photos WHERE idUser = ?', [userId], function(err, results2) {
                if (err) throw err;
                if (results2) {
                    results1[0].photos = results2;
                    res.status(200).end(JSON.stringify(results1[0]));
                }
            });

        }
    });

});

一切似乎都很顺利,但我认为这不是正确的方法,因为如果我想从对象中的其他表添加更多信息,我将不得不嵌套越来越多的函数......

有什么建议吗? 提前致谢。

最佳答案

查看Async ,或任何一个流行的 Promise 库( when.jsQ.jsBluebird )。

在异步中,它可能看起来像这样。

var async = require('async');

app.get('/users/:userId', function (req, res) {

  var userId = req.params.userId;
  async.parallel({
    user: function(callback){
      connection.query('SELECT * FROM users WHERE idUser = ?', [userId], callback)
    },
    photos: function(callback){
      connection.query('SELECT date, file, tags FROM photos WHERE idUser = ?', [userId], callback)
    }
  },
  // Final callback, with all the results
  function(err, results){
    //results now has {user: ..., photos: ...}
    var user = results.user;
    user.photos = results.photos;
    res.status(200).end(JSON.stringify(user));
  });


});

添加另一个调用就像在parallel(或任何其他函数)中添加另一个函数一样简单。该代码与 Promise 库非常相似,因此我将其作为练习留给您!

让我知道这有帮助。

关于mysql - 如何将各种 MySQL 查询结果合并到单个 JSON 对象中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30027923/

相关文章:

mysql - 使用 LEFT join 和 GROUP BY 删除行

php - UTF-8贯穿始终

javascript - JavaScript 中公共(public)字段声明的意义是什么?

javascript - MongoDB _id 作为字符串(MEAN 堆栈)

MySQL: 无法创建表 (errno: 150)

android - gson.fromJson() 内存不足异常

json - 如何为 v3 YouTube API 上传构建 JSON 中的片段和状态

json - 如何使用 Advanced REST Client 或 Postman 测试 Express/node REST API 后端?

node.js - 使用 NodeJs 上传文件

php - 连接 SQL 查询和回显结果