【问题标题】:Sequelize how to get all data if there is no query string passed如果没有传递查询字符串,Sequelize 如何获取所有数据
【发布时间】:2020-07-17 02:37:07
【问题描述】:

我是 Sequelize 的新手。

我正在尝试创建一个处理程序来获取我的数据库中的所有播放列表。

这就是我想做的:

  • 如果有查询字符串,则应根据该查询返回结果。
  • 如果没有传递查询字符串,那么它应该返回我所有的播放列表。

这是我的播放列表模型:

const Playlist = db.define("playlist", {
  id: {
    type: Sequelize.INTEGER,
    autoIncrement: true,
    primaryKey: true,
  },
  name: {
    type: Sequelize.STRING,
    unique: true,
  },
});

这是我的处理程序:

exports.getPlaylists = async (req, res) => {
  try {
    const { name } = req.query;
    console.log(name); // this prints the name
    const result = await Playlist.findAll({
      where: {
        name:
          name === undefined ? {} : { $like: `%${name}%` },
      },
    });
    if (result) {
      res.status(200).send(result);
    } else {
      response.status(404).send("No Playlists found");
    }
  } catch (error) {
    res.status(500).send(`Internal server error: ${error}`);
  }
};

如果我在查询中传递了一个名称,这会很好。但如果我没有传递任何查询字符串。它返回一个空数组。

$likeSequelize.Op.like 的别名

我应该放什么来代替空对象?

我检查了这个问题How get all data if field in query string is empty Node and Sequelize with Postgres,但建议的解决方案对我不起作用

【问题讨论】:

    标签: node.js express sequelize.js


    【解决方案1】:

    根据条件创建过滤器对象。如果您将空对象传递给 where,它将不会在查询中应用它。

    exports.getPlaylists = async (req, res) => {
      try {
        const { name } = req.query;
        const filters = {};
        if (name) 
          filters.name = {
            [Op.like]: `${name}%`, // you can also use $like if you are using older version of sequelize
        }
        const result = await Playlist.findAll({
          where: filters,
        });
        if (result) {
          res.status(200).send(result);
        } else {
          response.status(404).send("No Playlists found");
        }
      } catch (error) {
        res.status(500).send(`Internal server error: ${error}`);
      }
    };
    

    这样您可以根据其他查询字符串准备复杂的过滤器。

    【讨论】:

    • 谢谢。它对我有用,但我想问一下如果我有 3 个或 4 个查询字符串参数怎么办。处理它们而不是执行 if(name) if(age) ...etc 的最佳方法是什么?
    • 可惜没有,不过你也可以和[Op.or]混用,还是看你想要什么。
    猜你喜欢
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    相关资源
    最近更新 更多