Правильный способ загрузки данных из базы данных и загрузки их в представление в Vapor 3? - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть проект 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!
    }
}

Но этот код приводит к ошибке:

Неверное преобразование из функции выброса типа '(_) throws -> _' в тип функции без броска '(String) -> ()'

Если я попытаюсь return try reqest.view().render("newpost.leaf", content) выйти из блока, то я не смогу получить content. Пожалуйста, помогите мне найти правильный способ загрузки.

1 Ответ

0 голосов
/ 02 мая 2018

Вы должны взглянуть на Асинхронный раздел в документации (Обещания и т. Д.). Нет необходимости использовать обратные вызовы.

Это может быть один из способов получения данных из БД и их рендеринга с использованием 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 в пустую строку, например.

...