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