在 Swift Vapor 中返回一组响应可表示对象的最佳方法是什么?

查尔斯·肯尼

语境:

最近,我决定从事 Swift 服务器端开发,因为我认为 Vapor 框架非常酷。我在试验过程中遇到了一些困难,想要一些关于叶和蒸汽模板的建议。

在渲染视图时,我已经多次查看文档。使用变量渲染模板化视图需要叶模板的名称和包含变量的响应可表示节点对象。

尝试使用模板和框架本身制定一个场景(因为这是我最好的学习方式),我尝试模拟博客格式。这是我的课程/获取请求:

// MARK: Blog Post Object

final class BlogPost: NodeRepresentable {

    var postId: Int
    var postTitle: String
    var postContent: String
    var postPreview: String

    func makeNode(context: Context) throws -> Node {
        return try Node(node: [
            "postId":self.postId,
            "postTitle":self.postTitle,
            "postContent":self.postContent,
            "postPreview":self.postPreview
        ])
    }

    init(_ postId: Int, _ postTitle: String, _ postContent: String) {

        self.postId = postId
        self.postTitle = postTitle
        self.postContent = postContent
        self.postPreview = postContent.trunc(100)
    }
}


// MARK: Blog view request; iterate over blog objects

drop.get("blog") { request in
    let result = try drop.database?.driver.raw("SELECT * FROM Posts;")

    guard let posts = result?.nodeArray else {
        throw Abort.serverError
    }

    var postCollection = [BlogPost]()


    for post in posts {
        guard let postId = post["postId"]?.int,
            let postTitle = post["postTitle"]?.string,
            let postContent = post["postPreview"]?.string else {
                throw Abort.serverError
        }

        let post = BlogPost(postId, postTitle, postContent)
        postCollection.append(post)
    }

    // Pass posts to be tokenized

    /* THIS CODE DOESN'T WORK BECAUSE "CANNOT CONVERT VALUE OF TYPE 
     * '[BLOGPOST]' TO EXPECTED DICTIONARY VALUE OF TYPE "NODE"
     * LOOKING FOR THE BEST METHOD TO PASS THIS LIST OF OBJECTS
     */

    drop.view.make("blog", [
        "posts":postCollection 
    ])

}

这是我的blog.leaf文件:

#extend("base")

#export("head") {
    <title>Blog</title>
}

#export("body") {

    <h1 class="page-header">Blog Posts</h1>

    <div class="page-content-container">

    #loop(posts, "posts") {
        <div class="post-container">
            <h3 style="post-title">#(posts["postTitle"])</h3>
            <p style="post-preview">#(posts["postPreview"])</h3>
        </div>
    }

    </div>

}

问题:

如您所见,我在寻找迭代对象并将它们的属性模板化到叶文件中的最佳方法上有些困难。有人有什么建议吗?顺便说一句,抱歉糟糕的编程约定。我是面向对象/协议编程的新手。

查尔斯·肯尼

我最终做的是使 Post 模型符合 Model 协议。

import Foundation
import HTTP
import Vapor


// MARK: Post Class

final class Post: Model {
    
    var id: Node?
    var title: String
    var content: String
    var date: Date
    var isVisible: Bool
    
    // TODO: Implement truncate extension for String and set preview
    // to content truncated to 100 characters
    
    var preview = "placeholder"
    
    var exists: Bool = false
    
    init(title: String, content: String, isVisible: Bool = true) {
        
        self.title = title
        self.content = content
        self.date = Date()
        self.isVisible = isVisible
    }
    
    init(node: Node, in context: Context) throws {
        
        let dateInt: Int = try node.extract("date")
        let isVisibleInt: Int = try node.extract("isVisible")
        
        id = try node.extract("id")
        title = try node.extract("title")
        content = try node.extract("content")
        date = Date(timeIntervalSinceNow: TimeInterval(dateInt))
        isVisible = Bool(isVisibleInt as NSNumber)
        exists = false
    }
    
    func makeNode(context: Context) throws -> Node {
        
        return try Node(node: [
            
            "id": id,
            "title": title,
            "content": content,
            "date": Int(date.timeIntervalSince1970),
            "isVisible": Int(isVisible as NSNumber)
            ])
    }
    
    static func prepare(_ database: Database) throws {
        
        try database.create("Posts") { posts in
            
            posts.id()
            posts.string("title", optional: false)
            posts.string("content", optional: false)
            posts.int("date", optional: false)
            posts.int("isVisible", optional: false)
        }
    }
    
    static func revert(_ database: Database) throws {
        
        try database.delete("posts")
    }
}

然后返回/创建 Post 对象的实例:

import Vapor
import Foundation
import HTTP

final class BlogController {
    
    func addRoutes(_ drop: Droplet) {
        
        let blogRouter = drop.grouped("blog")
        let blogAPIRouter = drop.grouped("api","blog")
        
        blogRouter.get("posts", handler: getPostsView)
        
        blogAPIRouter.get("posts", handler: getPosts)
        blogAPIRouter.post("newPost", handler: newPost)
    }
    
    // MARK: Get Posts
    func getPosts(_ request: Request) throws -> ResponseRepresentable {
        
        let posts = try Post.all().makeNode()
        return try JSON(node: [
            "Posts":posts
            ])
    }
    
    // Mark: New Post
    func newPost(_ request: Request) throws -> ResponseRepresentable {
        guard let title = request.data["title"]?.string,
            let content = request.data["content"]?.string else {
                
                throw Abort.badRequest
        }
        
        var post = Post(title: title, content: content)
        try post.save()
        
        return "success"
    }
    
    // Mark: Get Posts Rendered
    func getPostsView(_ request: Request) throws -> ResponseRepresentable {
        return try getPosts(request)
    }
    
    
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

可以在Swift 2.2中使用Vapor Web框架吗?

来自分类Dev

Swift Vapor框架在JSON函数调用中的区别

来自分类Dev

Swift Vapor 3 构建错误

来自分类Dev

使用 Swift Vapor 代替 PHP

来自分类Dev

为什么在导入 Vapor 时会出现 Swift 编译器错误?

来自分类Dev

安装Vapor进行Swift后端开发

来自分类Dev

Ubuntu上的Serverside Swift和Vapor

来自分类Dev

Vapor 4 / Swift:中间件开发

来自分类Dev

Vapor Swift Fluent 非常非常慢的查询

来自分类Dev

查询在Vapor中如何工作?

来自分类Dev

Vapor Client GET响应中的空主体

来自分类Dev

Swift Vapor 3 + PostgreSQL + Docker-Compose正确的配置?

来自分类Dev

如何在 Swift 3 Vapor 中将 JSON 转换为字典

来自分类Dev

Laravel Vapor 部署后无法响应请求

来自分类Dev

为什么我的 Vapor 查询总是失败?

来自分类Dev

SwiftNIO和Vapor中的链式抛掷期货

来自分类Dev

在IOS SWIFT中缓存最后一个覆盖对象的最佳方法是什么。

来自分类Dev

使用Vapor迭代调用方法将返回Future

来自分类Dev

在Vapor中使用原始SQL返回的肠子总数

来自分类Dev

在MariaDB中保存UUID以与Vapor一起使用

来自分类Dev

Vapor 3 Leaf中的Javascript功能-帮助需要

来自分类Dev

需要帮助与Vapor 3中的Fluent进行许多匹配

来自分类Dev

在Vapor 4中使用Fluent进行复杂的查询

来自分类Dev

在Fluent / Vapor 4中,如何根据外键过滤列表?

来自分类Dev

如何在Vapor Web框架中安装SSL证书?

来自分类Dev

majorVersion和次要描述Vapor中的依赖项包

来自分类Dev

request.parameters.next 在 Vapor 机制中是如何工作的?

来自分类Dev

我自己在Swift中构造NSError对象的最佳方法是什么

来自分类Dev

为什么不能在 Swift 中创建一组协议一致性对象?

Related 相关文章

热门标签

归档