모델에 추가 속성을 어떻게 추가합니까?
Sep 11 2020
나는 다음 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및 NOTsomeProperty . 이 문제를 어떻게 해결합니까?
답변
2 CalebKleveter Sep 11 2020 at 15:38
모델의 표현과 다른 표현을 가진 데이터를 클라이언트에서 보내거나 받으려면 모델 유형과 변환 할 수있는 사용자 지정 유형을 정의하는 것이 일반적입니다.
이를 감안할 때 모델 대신 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또는 기타 필드 속성 래퍼의 경우 인코딩되지 않습니다.