我正在尝试使用Node和Express创建一个api路由,我必须说我没有太多经验。知道我有以下代码:
app.get('/api/place/:id', (req, res) => {
var id = req.params.id;
var message_error = '{"status": "failed", "message": "Unable to fetch data"}';
db.query("SELECT `id`, `user`, `lat`, `lon`, `elevation`, `rating`, `rating_count`, `country`, `continent`, `locality` FROM `t_points` WHERE id = ?", [id], (err, res1) => {
if(err) {
res.json(message_error);
} else {
//Store the user id from the points table and use it to fetch user datas
var userId = res1[0].user;
if(userId != null) {
db.query("SELECT `id`, `name` FROM `t_users` WHERE `id` = ?", [userId], (err, res2) => {
if(err) {
res.json(message_error);
} else {
//Final json structure
res.json({
id: res1[0].id,
lat: res1[0].lat,
lon: res1[0].lon,
elevation: res1[0].elevation,
rating: res1[0].rating,
rating_count: res1[0].rating_count,
user: {
id: res2[0].id,
name: res2[0].name
}
});
}
});
} else {
res.json({
id: res1[0].id,
lat: res1[0].lat,
lon: res1[0].lon,
elevation: res1[0].elevation,
rating: res1[0].rating,
rating_count: res1[0].rating_count
});
}
}
});
});
我正在对JSON结构进行硬编码,因此,如果表中的userId为null,则不会在json中打印用户对象,否则会打印它。但这不是一个好主意,因为我还将在同一路径中添加更多查询。是否有一种简单的方法在所有查询的末尾仅创建一个json,并且如果某些值为null则不显示它?
此外,最好使用async和await函数来代替它吗?
谢谢!
答案 0 :(得分:0)
在查询数据时使用 util 可能更好地获取结果。
const mysql = require('mysql');
const util = require('util');
// ? connection pool
let db = mysql.createPool({
connectionLimit: 10,
host: 'localhost',
port: 3306,
user: 'root',
password: 'secretpass',
database: 'yourdatabasename'
});
// ? check connection
db.getConnection((err, connection) => {
if (err) {
console.log('database connection failed');
} else {
console.log('database connection resolved');
connection.release();
}
});
// ? formatter query
function queryString(spName, ...queryParam) {
return mysql.format(spName, queryParam);
}
// ? do query
let performQuery = util.promisify(db.query).bind(db)
module.exports = {
performQuery,
queryString
}
然后像这样使用上面的函数:
app.get('/api/place/:id', async (req, res) => {
const id = req.params.id;
const message_error = '{"status": "failed", "message": "Unable to fetch data"}';
try {
let prepareOne = queryString(SELECT `id`, `user`, `lat`, `lon`, `elevation`, `rating`, `rating_count`, `country`, `continent`, `locality` FROM `t_points` WHERE id = ?", id);
let resultOne = await performQuery(prepareOne);
let userId = resultOne[0].user;
if (userId != null) {
let prepareTwo = queryString("SELECT `id`, `name` FROM `t_users` WHERE `id` = ?", userId);
let resultTwo = await performQuery(prepareTwo);
res.json({
...resultOne,
user: {
...resultTwo
}
});
}
} catch (err) {
res.send(message_error);
}