【问题标题】:Querying combinations of endpoint parameters with Sequelize in Express.js在 Express.js 中使用 Sequelize 查询端点参数的组合
【发布时间】:2019-12-21 07:27:56
【问题描述】:

使用 Express.js 中的 Sequelize ORM 查询 mySQL 数据库。

在 Express.js 中,我有一个端点,它接受两个参数“级别”和“主题”,就像这样,

//Get Topic
router.get("/tasks/:level&:topic", (req, res) => {
  Task.findAll({
      where: {
        Topic: req.params.topic,
        Level: req.params.level
      }
    })
    .then(tasks => {
      res.json(tasks)
    })
    .catch(err => {
      res.send("error: " + err)
    })
})

当我想查询“级别 AND 主题”时,这很有效。

但有时“级别”可能为空,我只想查询“主题”,而有时“主题”可能为空,我只想查询“级别”。

我想在这个端点中有很多参数,而不仅仅是这里的两个,并且能够查询这些参数的任意组合。

我想如果这是不可能的,我将不得不为每个参数组合创建一个端点。有没有更简单的方法来做到这一点?

任何帮助将不胜感激。

谢谢,

【问题讨论】:

    标签: mysql express sequelize.js


    【解决方案1】:

    我迟到了两年。但是最近几天我遇到了同样的问题,我认为我解决它的方式可以帮助其他人。 Sequelize 中有一个称为[Op.or] 的运算符。在这些情况下:

    //Get Topic
    router.get('/tasks', (req, res) => {
        Task.findAll({
            where: {
                [Op.or]: {
                    Topic: req.query.topic,  // /tasks?topic=topic
                    Level: req.query.level   // /tasks?level=level
                }
            }
        })
        .then(tasks => {
            res.json(tasks)
        })
        .catch(err => {
            res.send("error: " + err)
        })
    })
    

    也许考虑[Op.like] 来匹配查询:

    //Get Topic
    router.get('/tasks', (req, res) => {
        Task.findAll({
            where: {
                [Op.or]: {
                    Topic: { [Op.like]: '%' + req.query.topic + '%' },  
                    Level: { [Op.like]: '%' + req.query.level + '%' }   
                }
            }
        })
        .then(tasks => {
            res.json(tasks)
        })
        .catch(err => {
            res.send("error: " + err)
        })
    })
    

    【讨论】:

      【解决方案2】:

      如果是简单的field= value 查询,那么您可以使用以下查询 在这种情况下,

      在以下情况下,您必须保持参数名称与数据库字段名称相同

      router.get("/tasks/:Level&:Topic", (req, res) => { //<--- CHANGE
          Task.findAll({
                  where : req.params //<--- CHANGE
              })
              .then(tasks => {
                  res.json(tasks)
              })
              .catch(err => {
                  res.send("error: " + err)
              })
      })
      

      其他选项是检查req.params 并制作/创建where 查询 根据您的需要

      【讨论】:

      • 感谢您的回复,但我试图弄清楚如何处理参数组合,其中空参数不属于查询的一部分。
      • 在这种情况下,您必须遍历参数并根据需要创建创建查询,没有其他办法。
      • 是的,按照你的建议循环通过,谢谢
      • @ShaneG,很高兴知道:)
      【解决方案3】:

      我通过创建一个名为 query 的对象来完成这项工作,我根据它们是否为空来添加元素。

      然后我使用这个对象作为查询中的“where”条件,

      //Get Query
      router.get("/tasks/:level?/:topic?", (req, res) => {
        var query = {};
        if (req.params.topic != " ") {
          console.log("topic sent");
          query.Topic = req.params.topic;
        }
        if (req.params.level != " ") {
          console.log("level sent");
          query.Level = req.params.level;
        }
        console.log(query);
        Task.findAll({
            where: query
          })
          .then(tasks => {
            res.json(tasks)
          })
          .catch(err => {
            res.send("error: " + err)
          })
      })
      

      在 Vue.js 中使用此方法发送参数,

      getQuery(level, topic) {
            if (!topic) {
              topic = " ";
            }
            if (!level) {
              level = " ";
            }
            axios.get("/api/tasks/" + level + "/" + topic + "/").then(
              // axios.put('/api/task/' + id, {
              result => {
                console.log(result.data)
                this.todos = result.data
              },
              error => {
                console.error(error)
              }
            )
          },
      

      这将允许我处理来自端点的任何参数组合。]

      “?”在我在这篇文章https://stackoverflow.com/a/41736911/4001324 中找到的网址中,它允许参数是可选的。虽然在这里它们总是被传递,如果为空,则为空格。

      【讨论】:

      • 你将如何只传递主题值?
      • 如果只发送“主题”,则创建的查询可能是{主题:“机械”},如果只发送级别,则查询可能是{级别:“更高”},如果两者都发送创建的查询可能是 { 主题:“力学”,级别:“更高”}。所以 getQuery() 总是接收两个参数,其中一个是这些组合 getQuery(" ",topic) 或 getQuery(level," ") 或 getQuery(level,topic) 所以基本上缺少的参数作为空格“”传递。因此,如果参数不是由空格“”表示,则将其添加到查询对象中。这能解释清楚吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-04
      • 1970-01-01
      • 2020-09-08
      • 2014-11-24
      • 2019-12-08
      • 1970-01-01
      • 2019-03-24
      相关资源
      最近更新 更多