如何将动态查询参数对象转换为Sequelize运算符(Javascript符号)

如何将动态查询参数对象转换为Sequelize运算符(Javascript符号),javascript,sequelize.js,Javascript,Sequelize.js,我有一个动态的filter方法,它通过我需要用来过滤我的Sequelize查询的属性。例如,我可能想按特定的价格范围和生产日期过滤汽车的列表。生成如下所示的客户端查询: const response = await this.get('cars', { price: { gt: 80000 lt: 1200000 }, year: 2019 }) const Op = require('sequelize').Op; const whe

我有一个动态的
filter
方法,它通过我需要用来过滤我的
Sequelize
查询的属性。例如,我可能想按特定的价格范围和生产日期过滤
汽车的列表。生成如下所示的客户端查询:

const response = await this.get('cars', {
    price: {
        gt: 80000
        lt: 1200000
    },
    year: 2019
})
const Op = require('sequelize').Op;

const whereParams = {
    price: {
        [Op.gt]: 80000,
        [Op.lt]: 120000
    },
    year: 2019
}
查询参数将被序列化,发送到我的服务器,然后解码回对象形式。在这个查询中,我需要使用Sequelize的
[Op.gt]
[Op.lt]
符号,因为我需要按价格范围进行筛选。如何动态地将对象转换为如下所示:

const response = await this.get('cars', {
    price: {
        gt: 80000
        lt: 1200000
    },
    year: 2019
})
const Op = require('sequelize').Op;

const whereParams = {
    price: {
        [Op.gt]: 80000,
        [Op.lt]: 120000
    },
    year: 2019
}
这样我就可以在我的
where
属性中使用它们:

router.get('cars', (req, res) => {
    Car.findAll({
        where: whereParams
    }).then((cars) => {
        res.status(200).send(cars);
    })
})

我不能简单地硬编码Sequelize对象,因为这个过滤器参数是动态的,谢谢

至少对于您的简单示例,您可以完成这项工作

首先,确保Sequelize对象具有操作符别名:

 ... 
 dialect: 'mysql',
 operatorsAliases: { $lt: Op.lt, $gt: Op.gt},
 define: {
 ...
然后,设置一个转换:

const nodeJsonTransformer = require('json-transformer-node');

var carFilter = {
    price: {
        gt: 80000
        lt: 1200000
    }
}

var transformation = {
    mapping : {
      item : {
        price : {
          $gt : 'price.gt',
          $lt : 'price.lt'
        }
      }
    }
 };

var whereValues = nodeJsonTransformer.transform(carFilter, transformation);
Car.findAll( {where: whereValues})
生成的查询应包括
其中price>8000和price<12000
。警告:如果你有一个复杂的过滤器,这可能会很麻烦