1

我已经尝试过映射、平面映射、创建EventLoopFutureofPost等...我试图返回两个db.queries创建要在 上呈现的单独内容数组req.view.render,这将返回一个EventLoopFuture<View>.

我的错误是:Cannot convert value of type 'EventLoopFuture<[Posts]>' to expected argument type '[Posts]'.

这是路由器调用的我的代码:

func blogView(req: Request) throws -> EventLoopFuture<View> {
    struct PageContext: Encodable {
        var posts: [Posts]
        var categories: [Categories]
        var title: String
    }
    struct Posts: Encodable {
        var posts: BlogPostModel.ViewContext
        var category: BlogCategoryModel.ViewContext
    }
    struct Categories: Encodable {
        var categoryList: BlogCategoryModel.ViewContext
    }

    let posts = BlogPostModel.query(on: req.db)
        .sort(\.$date, .descending)
        .with(\.$category)
        .all()
        .mapEach {Posts(posts: $0.viewContext, category: $0.category.viewContext)}
    let categories = BlogCategoryModel.query(on: req.db)
        .sort(\.$title)
        .all()
        .mapEach {Categories(categoryList: $0.viewContext)}
    let returnContext = PageContext(posts: posts,categories: categories, title: categories)
    return req.view.render("Blog/Frontend/Blog", returnContext)
}

编辑:在下面重新发表我的评论。此代码段返回帖子(和关联的类别)。试图增加一秒钟db.query的回报。

func blogView(req: Request) throws -> EventLoopFuture<View> {
    struct Context: Encodable {
        struct PostWithCategory: Encodable {
            var category: BlogCategoryModel.ViewContext
            var post: BlogPostModel.ViewContext }
        let title: String
        let items: [PostWithCategory]
    }

    return BlogPostModel.query(on: req.db)
        .sort(\.$date, .descending)
        .with(\.$category)
        .all()
        .mapEach {
            Context.PostWithCategory(category: $0.category.viewContext, post: $0.viewContext) 
        }
        .flatMap {
            let context = Context(title: "Blog Posts", items: $0)
            return req.view.render("Blog/Frontend/Blog", context)
        }
}
4

1 回答 1

3

您的问题是您的PageContext类型具有类型[Post]and的属性[Categories],但是您正在尝试初始化PageContextusing EventLoopFuture<[Post]>and EventLoopFuture<[Categories]>。您可以做的是使用 NIO 的.and方法将 2 个EventLoopFuture对象组合为 1 个:

posts.and(categories) // EventLoopFuture<([Post], [Categories])>

然后,您可以映射到这个新EventLoopFuture的以获取元组并创建您的PageContext实例:

return posts.and(categories).flatMap { posts, categories in
    let returnContext = PageContext(posts: posts, categories: categories, title: "Blog Posts")
    return req.view.render("Blog/Frontend/Blog", context)
}
于 2020-07-22T13:11:59.393 回答