敏感数据的 Vapor 3 GET 路由

Vapor 3 GET route for sensitive data

使用大量关于 Vapor 3 的教程,我未能弄清楚如何编辑输出 JSON、f.e。为了获得特定的用户对象,我创建了路由:

protectedRouter.get("users", User.parameter, use: userController.user)

UserController中的方法:

func user(_ req: Request) throws -> Future<User> {
    return try req.parameters.next(User.self)
}

当然,它会发送用户对象内的所有内容,包括电子邮件和散列密码。伟大的。我怎样才能避免这种情况?我的意思是我只想发送 public 有关用户的信息(姓名、昵称、身份证等...)。

创建一个单独的结构来表示您想要的输出结构。使该结构符合 Content。每当您 return 您的用户时,首先将其转换为该结构。为用户添加一个扩展来执行此操作非常方便。

出现的一种常见模式是将此结构嵌套在调用它的模型中 Public。即,

extension User {
    struct Public: Content { ... }

    func makePublic() -> Public { ... }
}

您的路线将 return User.Public 而不是 User。请注意,此模式在反向也很有用,可为您的用户创建单独的 "input" 表示。

您可以在 Vapor → Content → Dynamic Properties 的 Vapor 文档中阅读更多相关信息。