Sequelize不接受where子句中的有效moment.js对象

时间:2017-09-24 12:42:44

标签: javascript node.js postgresql sequelize.js

我有以下续集查询:

let prms = periods.map((period, index, arr) => {
    if (arr[index + 1]) {
        return sequelize.models.Result.aggregate('value', 'avg', {
            where: {
                createdAt: {
                    $lt: arr[index + 1],
                    $gt: period
                },
                type: hook.params.headers.type,
                entityId: hook.params.headers.entity
            }
        }).catch(err => console.log('err'));
    }
})

现在,where对象上的createdAt属性导致了我这个问题:

  

错误:错误:无效值1506211200000        在Object.escape(C:\ Users \ George \ Source \ Repos \ myProj \ node_modules \ sequelize \ lib \ sql-string.js:50:11)        在Object.escape(C:\ Users \ George \ Source \ Repos \ myProj \ node_modules \ sequelize \ lib \ dialects \ abstract \ query-generator.js:917:22)

现在我不知道1506211200000号码的来源,arr[index + 1]period都是moment.js对象,我可以通过这样做验证这一点打印console.log(arr[index + 1].isValid(), period.isValid());的{​​{1}}。如果删除createdAt限制,则没有问题。

知道这里发生了什么吗?

注意:我正在使用Postgres

2 个答案:

答案 0 :(得分:3)

您需要使用moment方法将Date对象转换为moment#toDate对象,才能在续集查询中使用它:

...
createdAt: {
  $lt: arr[index + 1].toDate(),
  $gt: period.toDate()
},

答案 1 :(得分:0)

补充已接受的答案:如果您需要知道时区,您可能需要使用 moment 对象中的 format 方法。像这样:

...
where: {
  createdAt: {
    Op.lt: arr[index + 1].format(),
    Op.gt: period.format()
  }
...
}

使用 toDate 方法时,它将使用本地时区,因此在将代码部署到生产环境时,您可能会遇到看似拜占庭的错误,因为您部署的机器可能与您的本地机器具有不同的时区。

您可以进一步阅读有关此主题的内容 here