Swift Vapor 3从另一个路由器内部呼叫路由器

Swift Vapor 3从另一个路由器内部呼叫路由器,swift,vapor,Swift,Vapor,我使用Vapor 3开发了一个服务器应用程序,我设置了三个模型Book、Author、Publisher、具有CRUD和关系的相关路由器和控制器(Author和Publisher都与Book有兄弟关系)。 如果没有传入的数据,一切都会好起来:我收到的Json具有不同的数据结构,出版商和作者存储在书中的数组中 我无法在Book.self上解码,因为我会丢失与出版商和作者相关的数据,因此我创建了BookTotal,它在数据库中没有表示(没有迁移),因此我可以 req.content.decode(B

我使用Vapor 3开发了一个服务器应用程序,我设置了三个模型Book、Author、Publisher、具有CRUD和关系的相关路由器和控制器(Author和Publisher都与Book有兄弟关系)。 如果没有传入的数据,一切都会好起来:我收到的Json具有不同的数据结构,出版商和作者存储在书中的数组中

我无法在Book.self上解码,因为我会丢失与出版商和作者相关的数据,因此我创建了BookTotal,它在数据库中没有表示(没有迁移),因此我可以

req.content.decode(BookTotal.self).flatMap

此时,我想在传递BookTotal.Publisher和BookTotal.Author数组的Publisher和Author控制器上调用save或update函数

但是,虽然我可以通过以下方法来达到目的

`PublisherController.Save()`

我不知道如何把数据传给他们。控制器中的CRUD方法将请求作为参数,但我不知道如何构建一个

let newReq = Request()
newReq.content = BookTotal.Author
这是我的猜测,但请求需要一个容器,我不知道该怎么做。 我四处搜索,但找不到任何关于此类问题的示例/教程。
我这样做对吗?

所以你有两个选择来实现你想要做的事情。一个选项是重写控制器中的请求处理程序,以使用一个helper函数接受该数据。所以

func savePublisher(\req:Request,data:Publisher)抛出->未来
然后,您可以将
router.post(“您的”、“url”,使用:savePublisher)
更改为
router.post(Publisher.self,在:“您的”、“url”,使用:savePublisher)
。然后,如果您的代码不正确,您可以调用该方法并根据需要传递数据


(可能)更好的方法是将保存发布者的代码提取到一个单独的函数中,然后可以从
savePublisher
路线和
bookTotal
路线调用该函数。对于基本路线,这可能与第一个选项相同,但对于最复杂的路线,这是一条可行之路。

首先,谢谢您,谢谢您的回答。我还必须说,我觉得自己很傻,没有看到如此简单的解决方案。。。现在你向我指出这一点似乎很明显。关于您的第二个选项,我简单地尝试了一些类似的方法,但由于.save()方法需要DatabaseConnectable
publisher.save(on:req)这一事实,我被耽搁了
通常,我不知道是否应该传递原始请求或什么。我会一直传递
请求
——这是我通常做的事情,除非我正在编写一个不一定与请求相关的函数(通常在库中)。但是,如果您正在为自己的应用程序编写函数,只需使用
Request
let newReq = Request()
newReq.content = BookTotal.Author