首页 > 解决方案 > 如何在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 等待但最终收到很多错误消息..

标签: node.jsjsonrestapiasynchronous

解决方案


你可以使用 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);

}); });


推荐阅读