我正在尝试在 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.js , Q.js , Bluebird )。
在异步中,它可能看起来像这样。
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/