【问题标题】:Knexjs returning mysql timestamp, datetime columns as Javascript Date objectKnexjs 返回 mysql 时间戳、日期时间列作为 Javascript 日期对象
【发布时间】:2017-12-19 14:28:47
【问题描述】:

我正在使用 knexjs,我以 YYYY-MM-DD HH:mm:ss 的格式插入数据,例如 2017-07-14 15:00:00,并在获取数据时保存后,日期时间列值作为 javasript Date 对象返回。 我想以YYYY-MM-DD HH:mm:ss 的格式返回这些对象,但它以YYYY-MM-DDTHH:mm:ss.000Z 的格式返回,例如2017-06-23T06:44:44.000Z。 我通过手动迭代和转换它们来返回它们。我想知道是否有另一种方法来做到这一点,比如在 mysql 驱动程序或 knexjs 配置中。目前我的 knexjs 配置是这样的。

 var connection = require('knex')({
            client: 'mysql',
            connection: {
                host: db.host,
                user: db.user,
                password: db.password,
                database: db.database,
                timezone: 'UTC'
            }
       });

【问题讨论】:

    标签: javascript mysql node.js knex.js


    【解决方案1】:

    用这个改变你的连接对象:

    var connection = require('knex')({
            client: 'mysql',
            connection: {
                host: db.host,
                user: db.user,
                password: db.password,
                database: db.database,
                timezone: 'UTC',
                dateStrings: true
            }
       });
    

    【讨论】:

    • 在这种情况下,dateStrings 选项确实是更好的选项,如果默认格式可以的话。 +1
    【解决方案2】:

    这就是 mysql 驱动程序如何将从数据库读取的类型转换为 javascript (https://github.com/mysqljs/mysql#type-casting)

    您可以通过添加typeCast 连接选项来覆盖默认转换:

    var moment = require('moment');
    var connection = require('knex')({
            client: 'mysql',
            connection: {
                host: db.host,
                user: db.user,
                password: db.password,
                database: db.database,
                timezone: 'UTC',
                typeCast: function (field, next) {
                  if (field.type == 'DATETIME') {
                    return moment(field.string()).format('YYYY-MM-DD HH:mm:ss');
                  }
                  return next();
                }
            }
       });
    

    我不确定您是否需要为 DATETIMETIMESTAMP 类型添加自定义解析。

    【讨论】:

    • 感谢@mikael,它肯定会帮助其他不想要默认格式的人。
    • Tihis 是一个更好的解决方案,我希望我的 mysql 的 DATE 类型为字符串,而 DATETIME 原样,我根据我的需要修改了答案,它就像一个魅力。
    【解决方案3】:

    在我的例子中,连接是一个字符串,所以我必须找到日期 OID 并使用 pg.types.setTypeParser(DATE_OID, d => moment(d));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-16
      • 2022-01-14
      • 1970-01-01
      • 2016-12-22
      • 2011-03-05
      • 2013-09-27
      • 1970-01-01
      相关资源
      最近更新 更多