Как выполнить больше запросов в одном Express Router.get - PullRequest
1 голос
/ 02 октября 2019

router.get("/members", (req, res) => {
  let page = req.query.page;
  let pageSize = req.query.pageSize;

  if (typeof page === "undefined") {
    page = 0;
  } else {
    page -= 1;
  }

  if (typeof pageSize === "undefined") {
    pageSize = 5;
  }

  var skip = page * pageSize;

  db.sequelize.query(
    "SELECT id, mbr_id, mbr_name, mbr_type " +
    "FROM tbl_members " +
    "LIMIT " + pageSize + " " +
    "OFFSET " + skip
  )
  .then(members => {
      res.json(members[0])          
  })
  .catch(err => {
      res.send("error: " + err)
  })
})

Я хотел бы добавить еще один запрос MySQL. Как мне изменить мой код, чтобы я мог добавить еще один запрос MySQL и добавить результат в переменную res. Запрос, который я хотел бы добавить, получает общее количество записей запроса выше без ограничения и смещения. Собираюсь использовать это для нумерации страниц.

Кроме того, мне нужно использовать async / await на стороне сервера? Моя клиентская сторона уже имеет async / await перед вызовом моего кода выше. Я прочитал эту ветку , прежде чем опубликовать это. У него есть образцы кодов и некоторые пояснения. Он говорит о параллели с обещанием - мне не требуется параллельное выполнение запроса, просто я выполняю более одного запроса в одном router.get ().

Я также предпочитаю использовать оператор MySQL, как я привык кОператоры SQL и не столько в ORM, особенно при определении отношений и использовании агрегатов - пока что все еще непонятно.

Ответы [ 2 ]

1 голос
/ 03 октября 2019

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

router.get("/members", (req, res) => {
  let page = req.query.page;
  let pageSize = req.query.pageSize;

  if (typeof page === "undefined") {
    page = 0;
  } else {
    page -= 1;
  }

  if (typeof pageSize === "undefined") {
    pageSize = 5;
  }

  var skip = page * pageSize;

  db.sequelize.query(
    "SELECT id, mbr_id, mbr_name, mbr_type " +
    "FROM tbl_members " +
    "LIMIT " + pageSize + " " +
    "OFFSET " + skip
  ).then(members => {
      return db.sequelize.query(your second query).then(results => {
          res.json({member: members[0], otherResults: results})
      });
  }).catch(err => {
      res.status(500).send("error: " + err)
  });
});

Или вы можете использовать async/await следующим образом:

router.get("/members", async (req, res) => {
  let page = req.query.page;
  let pageSize = req.query.pageSize;

  if (typeof page === "undefined") {
    page = 0;
  } else {
    page -= 1;
  }

  if (typeof pageSize === "undefined") {
    pageSize = 5;
  }

  var skip = page * pageSize;

  try {
      let members = await db.sequelize.query(
        "SELECT id, mbr_id, mbr_name, mbr_type " +
        "FROM tbl_members " +
        "LIMIT " + pageSize + " " +
        "OFFSET " + skip
      );
      let otherResults = await db.sequelize.query(your second query);
      res.json({member: members[0], otherResults: otherResults});
  } catch(err) {
      res.status(500).send("error: " + err)
  }
});

Или, еслиЗапросы БД полностью независимы друг от друга, вы можете использовать Promise.all(), чтобы отслеживать, когда они оба были выполнены.

1 голос
/ 02 октября 2019

У вас есть несколько вариантов:

  1. async/await https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
  2. Promise.all(query1, query2) https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all
  3. Вы можете связать свой Promises

Это зависит от того, как вы хотите и что чувствует себя хорошо для вас. Я не думаю, что есть правильный путь для этого, однако я бы выбрал async/await, с моей точки зрения, это приводит к более чистому коду, но в нем есть подводные камни.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...