json - 如何将 Sequelize 过滤器格式化为有效的 JSON

标签 json node.js api sequelize.js

我正在设置一个 API。服务器从客户端接收一个 JSON 格式的过滤器,供 sequelize 在查询 MySQL 数据库时使用。

我一直在用 postman 进行测试。

以下json,可以发到服务器,但是sequelize不喜欢"[Op.or]"因为它应该是 [Op.or]没有引号。

但是,如果我不添加引号,那么它不是有效的 JSON,我无法发布数据。

//Sequelize does not like this because of the quotes around "[Op.or]"
{
    "filters": {"week": 201740, "project": 8, "itemgroup": {"[Op.or]": ["group1", "group2"]}}
}

//This is can not be sent as a JSON body in an API request because there are
//no quotes around [Op.or]
{
    "filters": {"week": 201740, "project": 8, "itemgroup": {[Op.or]: ["group1", "group2"]}}
}

这是我进行 sequelize 调用的脚本文件。JSON 过滤器是通过函数头中的过滤器变量传入的。
module.exports = {
    getAOLDataCount:  function (res, filters) {
        let result = '';
        wd = new WeeklyData(sequelize, Sequelize.DataTypes);
        wd.count({where: filters}).then(function (aolCount) {
            res.send('the value ' + aolCount);
        });
        return result;
    }
};

最佳答案

您的客户端(大概)不会安装 Sequelize 并且无法通过 JSON 传递 Sequelize 运算符,因此您尝试做的事情并不完全可能。您可能会让客户端发送字符串(例如 orand,然后您必须将这些字符串映射到 Sequelize 运算符)[1]。

"filters": {"week": 201740, "project": 8, "itemgroup": {"or": ["group1", "group2"]}}

然后在您的服务器代码中,您需要维护一个字符串映射到 Sequelize 运算符:
const operatorsMap = {
  or: [Op.or],
  and: [Op.and],
  etc
}

然后对于每个请求,您将遍历所有键并用 Sequelize 运算符替换字符串。
function isObject(o) {
  return o instanceof Object && o.constructor === Object;
}

function replacer(obj) {
  var newObj = {};
  for (key in obj) {
    var value = obj[key];

    if (isObject(value)) {
      newObj[key] = replacer(value);
    } else if (operatorsMap[key]) {
      var op = operatorsMap[key];
      newObj[op] = value;
    } else {
      newObj[key] = value
    }
  }

  return newObj;
}

module.exports = {
    getAOLDataCount:  function (res, filters) {
        let result = '';
        wd = new WeeklyData(sequelize, Sequelize.DataTypes);
        wd.count({where: replacer(filters)}).then(function (aolCount) {
            res.send('the value ' + aolCount);
        });
        return result;
    }
};

仅供引用,上面的代码尚未经过测试。

[1] 在不了解您的项目细节的情况下,我建议您重新考虑这种方法。客户端真的不应该发送直接馈送到 ORM 的 JSON 对象。糟糕的 SQL 注入(inject)怎么办?如果您升级 Sequelize 并且旧过滤器被弃用怎么办?相反,考虑允许通过查询参数进行过滤,并让您的 API 基于此创建过滤器对象。

关于json - 如何将 Sequelize 过滤器格式化为有效的 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48465321/

相关文章:

performance - 在express中使用nodejs可以采取哪些措施来提高jade模板渲染性能

PHP + Quickbook 在线版(API 集成)?

javascript - 如何使用相同/重复的键构建关联数组

json - 使用 JSONPath 仅获取顶级子项

c++ - 构建时的 node-gyp 链接库依赖项

c# - 通过发送信号向下滚动网络浏览器

c# - 我正在使用 python 的 request.post 方法来调用用 C# 开发的 API 的 post 方法

python - 如何迭代 JSON 列表以仅查找我网站的 URL?

javascript - 不使用 ajax 发布 JSON 值

node.js - 选择 'onchange' 不适用于 Jade Node JS