如何在 Heroku 上使用 Vapor 3 运行 将 JSON 响应中的 Postgres 日期转换为 ISO8601?

How do I convert Postgres dates to ISO8601 in JSON responses with Vapor 3 running on Heroku?

我在 Heroku 上安装了 Vapor 3 API。不幸的是,它没有正确处理日期。最初,我认为我可以在 Vapor 中简单地将日期视为字符串,如下所示:

struct MyModel {
  var time: String?
}

但是每当我从数据库中获取 MyModels 和 return 时,time 键根本不会出现(而其他键和值没有问题)。我以为我可以将 time 的类型更改为 Date,但结果是一样的,而且我已经使用 ContentConfig 设置了 JsonEncoder.dateEncodingStrategy.iso8601(再次,运气不佳——也许是因为 dateEncodingStrategy 仅支持 Linux 上的毫秒数,这是 Heroku 使用的?)。

如何在 Heroku 上使用 Vapor 3 运行 在 json 中将 Postgres 日期转换为 ISO8601?

成功了!只是将属性更改为 Dates,并将请求查询参数也手动转换为 Dates(用于 filter 调用)。所以,比 Vapor 3 中的大多数东西多一点手工,但并不可怕。

例如,我的模型现在看起来像这样:

struct MyModel {
  var time: Date?
}

然后当我尝试按日期过滤时,我会这样做:

var builder = MyModel.query(on: req)
if let afterString: String = try? self.query.get(String.self, at: "after") {
    let afterDate: Date? = DateFormatter.iso8601Full.date(from: afterString)
    builder = builder.filter(\.time > afterDate)
}

其中 after 是一个 url 参数,DateFormatter.iso8601Full 是我的 iso8601 日期格式化程序。然后,当我在响应中返回一个 MyModel 数组时,我将该数组映射到一个 MyModelResponseObject 数组,如下所示:

struct MyModelResponseObject {
  var time: String?
}

通过做这样的事情:

myModelsFuture.all().map(to: [MyModelResponseObject].self, { (myModels) -> [MyModelResponseObject] in 
    return myModels.map { it in
        return MyModelResponseObject(time: DateFormatter.iso8601Full.string(from: it.time ?? Date.init(timeIntervalSince1970: 0)))
    }
}

所以基本上我是在 JSON 中将日期手动转换为我想要的格式。