从数据库加载数据并将其加载到Vapor 3中的视图的正确方法?

时间:2018-04-29 05:19:08

标签: swift swift4.1 vapor

我有一个Vapor 3项目,可以上传一些格式为html的内容字符串。并具有将此内容加载为html页面的功能。代码如下:

func newpost(_ reqest: Request) throws -> Future<View> {
    self.getContent(req: reqest) { (content) in
        return try reqest.view().render("newpost.leaf", content)
    }

}

func getContent(req:Request, callback: @escaping (String) -> ()) {
   let _ = BlogModel.query(on: req).first().map(to: BlogModel.self) { (blog) -> (BlogModel) in
        callback((blog?.content)!)
        return blog!
    }
}

但是这段代码会导致错误:

  

投掷类型&#39;(_)抛出函数的转换无效 - &gt; _&#39;到非投掷函数类型&#39;(字符串) - &gt; ()&#39;

如果我尝试return try reqest.view().render("newpost.leaf", content)站点,那么我无法获得content。请帮我正确加载它。

1 个答案:

答案 0 :(得分:0)

您应该查看文档中的Async section(承诺等)。没有必要使用回调。

这可能是从数据库获取数据并使用Leaf渲染数据的一种方法(它与您的代码的想法相同,但用Promises替换回调并清理不必要的代码):

enum APIError: AbortError {
    case dataNotFound
}

/// Render the HTML string using Leaf
func newPost(_ req: Request) throws -> Future<View> {
    return getContent(req)
        .flatMap(to: View.self) { model in
            // By default, Leaf will assume all templates have the "leaf" extension
            // There's no need to specify it
            return req.view().render("newpost", model)
        }
}

/// Retrieve X content from the DB
private func getContent(_ req: Request) throws -> Future<BlogModel> {
    return BlogModel.query(on: req)
        .first() // can be nil
        .unwrap(or: APIError.dataNotFound)
        // returns an unwrapped value or throws if none
}

如果你不想在没有找到数据的情况下抛出,你可以使用nil-coalescing将nil转换为空字符串。例如。