как структурировать JSON в остальных API вызова и сделать его синхронным - PullRequest
0 голосов
/ 11 ноября 2019

Я пытаюсь структурировать ответ json с помощью nodejs restapi, но мой ответ всегда отправляется раньше, даже если функция не была выполнена.

Я пытался ждать с обещанием, что ничего не работает, и отправить ошибку ..

// это моя желаемая структура для 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);

  });
});

Я всегда получаю [] массив в качестве ответа ... хотя я знаю проблему, что ответ отправляется, хотя цикл еще не закончен, но не знаю, как решить .. пытался ждать с обещаниемно в конечном итоге с таким количеством сообщений об ошибках ..

Ответы [ 2 ]

1 голос
/ 12 ноября 2019

Вы можете решить эту проблему, используя 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);

});});

0 голосов
/ 14 ноября 2019

это то, что я сделал, который работал отлично

/*------------------------ 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);
      });
    }
  });
});
/*------------------------ ***************************** ---------------------------*/

...