node.js - 如何在rest api调用中构造json并使其同步
问题描述
我正在尝试使用 nodejs restapi 构建一个 json 响应,但即使该函数尚未执行,我的响应总是会提前发送。
我尝试等待承诺没有任何效果并发送错误..
//这是我想要的json结构
[
{
"user_id": "2",
"user_name": "Mehedi Hasan",
"permissions": [
{
"table_name": "questionbank",
"permission_create": "true",
"permission_update": "true",
"permission_delete": "true"
},
{
"table_name": "questionbankquestions",
"permission_create": "true",
"permission_update": "true",
"permission_delete": "true"
},
{
"table_name": "subjects",
"permission_create": "false",
"permission_update": "true",
"permission_delete": "false"
},
{
"table_name": "subjectquestions",
"permission_create": "true",
"permission_update": "true",
"permission_delete": "true"
},
{
"table_name": "modeltests",
"permission_create": "true",
"permission_update": "true",
"permission_delete": "true"
},
{
"table_name": "modeltestquestions",
"permission_create": "true",
"permission_update": "true",
"permission_delete": "true"
}
]
},
............................
]
//这是我试过的
function getAllUser(done) {
var sql = "SELECT users.id, users.username FROM users";
db.query(sql, [], function(err, rows, fields) {
if (err) throw err;
done(rows);
});
}
/*--------------------------Check user permission --------------------------*/
router.get("/adminpermissions", function(req, res) {
var sql =
"SELECT table_name, permission_create, permission_update, permission_delete FROM permissions " +
"WHERE user_id = ?";
finalArray = [];
jsonFormat = [];
permissionArray = [];
getAllUser(function(user) {
for (var i = 0; i < user.length; i++) {
userId = user[i].id;
userName = user[i].username;
db.query(sql, [userId], function(err, rows, fields) {
if (err) {
res.status(500).send({ error: "Something failed!" });
}
console.log(rows);
permissionArray[i] = rows;
var data = {
user_id: userId,
user_name: userName,
permission: permissionArray[i]
};
jsonFormat.push(data);
});
}
res.json(jsonFormat);
});
});
我总是得到 [] 数组作为响应.. 虽然我知道即使循环尚未完成但正在发送响应的问题但不知道如何解决.. 尝试用 promise 等待但最终收到很多错误消息..
解决方案
你可以使用 async/await 来解决这个问题。你可以这样做: -
router.get("/adminpermissions", function(req, res) {
var sql =
"SELECT table_name, permission_create, permission_update, permission_delete FROM
permissions " +
"WHERE user_id = ?";
finalArray = [];
jsonFormat = [];
permissionArray = [];
getAllUser(async function(user) {
for (var i = 0; i < user.length; i++) {
userId = user[i].id;
userName = user[i].username;
sql = "SELECT table_name, permission_create, permission_update, permission_delete
FROM permissions WHERE user_id = "+ userId;
try {
let result = await db.query(sql)
permissionArray[i] = result[0];
var data = {
user_id: userId,
user_name: userName,
permission: permissionArray[i]
};
jsonFormat.push(data);
} catch(err) {
res.status(500).send({ error: "Something failed!" });
}
}
res.json(jsonFormat);
}); });
推荐阅读
- c# - 计算字符串数组中每行中的元音C#
- javascript - 如何动态更新particlesConfig中的particlejs颜色?
- c# - cosmosOS 中的文本编辑器
- php - 当我使用 ajax 单击编辑按钮时,如何填充选择选项?
- java - 为 SoundBoard 恶作剧程序添加声音
- google-sheets - 多个(5 列)动态相关下拉列表 Google 表格
- java - Spring中@RequestBody从String到对象的自动反序列化
- mongodb - 有没有办法使用 $where 运算符来获取 MongoDB 中包含指定字符串的数据?
- android-notifications - 使用 ExoPlayer 的 media2 扩展程序时,如何为我的应用程序禁用 Android 11 媒体通知?
- javascript - 我无法在 HTML 中使用 JavaScript 更改 var 元素的数据