簡體   English   中英

如何使用在 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?
}

但是每當我從數據庫中獲取MyModel並返回它時, time鍵根本不會出現(而其他鍵和值沒有問題)。 我以為我可以將time的類型更改為Date ,但這導致了同樣的事情,並且我已經使用ContentConfigJsonEncoder.dateEncodingStrategy設置為.iso8601 (同樣,沒有運氣 - 也許是因為dateEncodingStrategy only在 Linux 上支持millis,這是 Heroku 使用的?)。

如何在 Heroku 上運行 Vapor 3 的情況下將 Postgres 日期轉換為 json 格式的 ISO8601?

搞定了! 只是將屬性更改為Date s,並手動將請求查詢參數也轉換為Date s(用於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 中返回它們時想要的格式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM