모델에 추가 속성을 어떻게 추가합니까?

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또는 기타 필드 속성 래퍼의 경우 인코딩되지 않습니다.