如何在带子的情况下保存模型并在Vapor 3中作为响应返回带子的已保存模型

问题描述 投票:0回答:1

我正在尝试编写一个控制器函数,以同时插入带有子模型的模型,并获得相同的JSON响应作为回报,但填充了从数据库添加的数据(即,自动生成的ID)。] >

在下面的简化示例中,JSON请求主体看起来像这样:

{
    "field1": "blabla",
    "subContent": {
        "field2": "lalala"
    }
}

我期待以下答复:

{
    "id": 5,
    "field1": "blabla",
    "subContent": {
        "id": 44,
        "field2": "lalala"
    }
}

不幸的是,下面的代码无法编译,错误消息显示“无法将类型'EventLoopF​​uture'的表达式转换为类型'Response'。此操作在线发生>]

return subModel.create(on: req).flatMap { savedSubModel ->

这里是代码:

struct MainContent: Content {
    var id: UUID?
    var field1: String
    var subContent: SubContent
}

struct SubContent: Content {
    var id: UUID?
    var field2: String
}

final class Controller {
    func create(_ req: Request) throws -> EventLoopFuture<Response> {
        return try req.content.decode(MainContent.self).map { request in
            let subModel = SubModel(
                field2: request.subContent.field2
            )
            return subModel.create(on: req).flatMap { savedSubModel -> EventLoopFuture<Response> in
                let mainModel = mainModel(
                    subModelId: savedSubModel.id!,
                    field1: request.field1
                )
                return mainModel.create(on: req).flatMap { savedMainModel -> EventLoopFuture<Response> in
                    let content = MainContent(
                        id: savedMainModel.id,
                        field1: savedMainModel.field1,
                        subContent: SubContent(
                            id: savedSubContent.id,
                            field2: savedSubContent.field2
                        )
                    )
                    return content.encode(status: .created, for: req)
                }
            }
        }
    }
}

我正在尝试编写一个控制器函数,以同时插入带有子模型的模型,并获得相同的JSON响应作为回报,但是填充了从数据库添加的数据(即...

] >
struct MainContent: Content {
    var id: UUID?
    var field1: String
    var subContent: SubContent
}

struct SubContent: Content {
    var id: UUID?
    var field2: String
}

final class Controller {
    func create(_ req: Request) throws -> EventLoopFuture<Response> {
        return try req.content.decode(MainContent.self).flatMap { request in
            let subModel = SubModel(
                field2: payload.subContent.field2
            )
            return subModel.create(on: req)
        }.flatMap { savedSubModel in
            let mainModel = mainModel(
                subModelId: try savedSubModel.requireID(),
                field1: request.field1
            )
            return mainModel.create(on: req).flatMap { savedMainModel in
                let content = MainContent(
                    id: try savedMainModel.requireID(),
                    field1: savedMainModel.field1,
                    subContent: SubContent(
                        id: try savedSubModel.requireID(),
                        field2: savedSubModel.field2
                    )
                )
                return content.encode(status: .created, for: req)
            }
        }
    }
}
swift vapor
1个回答
0
投票
struct MainContent: Content {
    var id: UUID?
    var field1: String
    var subContent: SubContent
}

struct SubContent: Content {
    var id: UUID?
    var field2: String
}

final class Controller {
    func create(_ req: Request) throws -> EventLoopFuture<Response> {
        return try req.content.decode(MainContent.self).flatMap { request in
            let subModel = SubModel(
                field2: payload.subContent.field2
            )
            return subModel.create(on: req)
        }.flatMap { savedSubModel in
            let mainModel = mainModel(
                subModelId: try savedSubModel.requireID(),
                field1: request.field1
            )
            return mainModel.create(on: req).flatMap { savedMainModel in
                let content = MainContent(
                    id: try savedMainModel.requireID(),
                    field1: savedMainModel.field1,
                    subContent: SubContent(
                        id: try savedSubModel.requireID(),
                        field2: savedSubModel.field2
                    )
                )
                return content.encode(status: .created, for: req)
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.