我正在设置一个 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 运算符,因此您尝试做的事情并不完全可能。您可能会让客户端发送字符串(例如 or
、and
,然后您必须将这些字符串映射到 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/