【问题标题】:Sequelize not accepting valid moment.js object in where clauseSequelize 在 where 子句中不接受有效的 moment.js 对象
【发布时间】:2018-03-05 12:49:33
【问题描述】:

我有以下续集查询:

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()); 来验证这一点 true true .如果删除 createdAt 限制,则没有问题。

知道这里发生了什么吗?

注意:我正在使用 Postgres

【问题讨论】:

    标签: javascript node.js postgresql sequelize.js


    【解决方案1】:

    您需要使用moment#toDate方法将moment对象转换为Date对象,以便在sequelize查询中使用:

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

    【讨论】:

      【解决方案2】:

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

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

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

      你可以阅读更多关于这个话题here

      【讨论】:

        猜你喜欢
        • 2020-05-02
        • 2014-11-02
        • 1970-01-01
        • 1970-01-01
        • 2014-11-07
        • 2016-07-09
        • 1970-01-01
        • 2016-10-28
        • 2018-01-08
        相关资源
        最近更新 更多