简体   繁体   English

如何在 rest api 调用中构造 json 并使其同步

[英]how to structure json in rest api call and make it synchronous

I am trying to structure a json response with nodejs restapi but my response is always sent earlier even though the function has not been executed.我正在尝试使用 nodejs restapi 构建 json 响应,但即使 function 尚未执行,我的响应总是会提前发送。

i tried await with promise nothing works and send error..我尝试使用 promise 等待没有任何效果并发送错误..

//this is my desired structure for 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"
            }
        ]
    },

............................

]

//this is what i tried //这是我试过的

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);

  });
});

i am always getting [] array as response.. though i know the problem that the response is being send even though the loop has not been finished but dont know how to solve.. tried await with promise but end up with so many error messages..我总是得到 [] 数组作为响应.. 虽然我知道即使循环尚未完成但正在发送响应的问题但不知道如何解决.. 尝试使用 promise 等待但最终收到很多错误消息..

You can solve the issue by using async/await.你可以使用 async/await 来解决这个问题。 You can do something like this:-你可以这样做: -

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);

}); }); }); });

this is what i did which worked perfectly这就是我所做的,效果很好

/*------------------------ Get Permissions of All User -----------------------------*/
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);
  });
}

function getPermission(user_id, user_name,profile_image, done) {
  var sql =
    "SELECT table_name, permission_create, permission_update, permission_delete FROM permissions " +
    "WHERE user_id =?";
  db.query(sql, [user_id], function(err, rows, fields) {
    if (err) throw err;
    done(user_id, user_name, profile_image, rows);
  });
}

router.get("/allpermissions", function(req, res) {
  var i = 0;
  var data = [];
  getAllUser(function(user) {
    for (i = 0; i < user.length; i++) {
      getPermission(user[i].id, user[i].username,user[i].profile_image, function(
        userId,
        userName,
        profileImage,
        rows
      ) {
        data.push({
          user_id: userId,
          user_name: userName,
          profile_image: profileImage,
          permissions: rows
        });
        if (data.length == user.length) {
          res.json(data);
        }
        //console.log(data);
      });
    }
  });
});
/*------------------------ ***************************** ---------------------------*/

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM