【问题标题】:How to Execute more queries in one Express Router.get如何在一个 Express Router.get 中执行更多查询
【发布时间】:2020-02-01 02:49:11
【问题描述】:

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 了。在发布此内容之前,我已经阅读了此 thread。它有示例代码和一些解释。它谈论并行与承诺 - 我不需要并行查询执行,只是我在单个 router.get() 中执行多个查询。

我也更喜欢使用 MySQL 语句,因为我习惯于使用 SQL 语句,而不是 ORM,尤其是在定义关系和使用聚合方面——现在仍然令人困惑。

【问题讨论】:

    标签: node.js express sequelize.js


    【解决方案1】:

    你有不止一个选择:

    1. async/awaithttps://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,从我的角度来看,它会产生更干净的代码,但它有缺陷。

    【讨论】:

      【解决方案2】:

      只需对您的查询进行排序。假设第二个查询依赖于第一个,您可以像这样对它们进行排序:

      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() 来跟踪它们何时完成。

      【讨论】:

      • 我使用后一个代码 async/await 组合——我只是好奇为什么结果是 2 个相同信息的数组。这就是为什么我使用 members[0] 只是为了提供一个结果。
      猜你喜欢
      • 2015-07-25
      • 1970-01-01
      • 2018-04-04
      • 1970-01-01
      • 2012-08-15
      • 1970-01-01
      • 1970-01-01
      • 2014-03-02
      • 1970-01-01
      相关资源
      最近更新 更多