我有一个Model
符合Content
:
import Vapor
import Fluent
final class User: Model, Content {
static let schema = "user"
@ID(key: .id)
var id: UUID?
@Field(key: "email")
var email: String
init() { }
init(id: UUID? = nil, email: String) {
self.id = id
self.email = email
}
}
可以从数据库中获取并直接从路由返回,因此客户端将用户作为JSON接收。
现在,我想向用户添加一个附加属性,该属性不存储在数据库中,而是一个固定值,或者只是在用户从数据库加载后添加:
final class User: Model, Content {
// ...
var someOther: String = "hello"
// ...
}
要么
final class User: Model, Content {
// ...
var someOther: String? // set later
// ...
}
现在的问题是,这个属性没有被加入到JSON,所以客户端只得到了用户的id
和email
与不中someProperty
。我该如何解决?
当您要从客户端发送或接收与模型具有不同表示形式的数据时,通常的做法是定义一个自定义类型,然后可以在该类型之间进行转换。
鉴于此,您将定义一个User.Response
符合的新类型,Content
而不是User
模型,然后从您的路线返回该类型。
extension User {
struct Response: Content {
let id: UUID
let email: String
let otherValue = "Hello World"
}
}
func user(request: Request) throws -> EventLoopFuture<User.Response> {
return User.find(UUID(), on: request.db).flatMapThrowing { user in
guard let id = user.id else {
throw Abort(.internalServerError, "User is missing ID")
}
return User.Response(id: id, email: user.email)
}
}
您添加的附加价值不是从你的模型编码的原因是因为模型类型遍历字段属性的默认编码器和编码这些属性,所以如果你有不使用的一个属性ID
,Field
,Parent
,Children
或其他字段属性包装器,则不会对其进行编码。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句