Vapor 如何为单个路由配置请求正文大小

Vapor How to configure request body size for an individual route

我正在使用 Vapor 构建我的后端。我正在尝试更改一条特定路线的默认最大车身尺寸以避免 413 Payload Too Large 错误。

我按照说明 here 并尝试输入:

app.on(.POST, "listings", body: .collect(maxSize: "1mb")) { req in
    // Handle request. 
}

两者都

func routes(_ app: Application) throws {}

public func configure(_ app: Application) throws {}

但他们都抛出错误 Type '()' cannot conform to 'ResponseEncodable'app 这样做的正确方法是什么?谢谢!

编辑: 感谢 Leo 和 0xTim 的回答,我才得以解决上述错误。 但是,我仍然遇到以下代码的 413 Payload Too Large 错误:

func routes(_ app: Application) throws {    
    try app.register(collection: ListingController())
    app.on(.POST, "api/listings", body: .collect(maxSize: "10mb"), use: ListingController.post)
}
struct ListingController: RouteCollection {
    func boot(routes: RoutesBuilder) throws {
        let listingRoutes = routes.grouped("api", "listings")
        listingRoutes.post(use: ListingController.post)
    }

    static func post(request: Request) throws -> EventLoopFuture<List> {
        let data = try req.content.decode(CreateListData.self)
        let list = try List(list: data.list)
        return list(on: req.db).map { list }
    }
}

您需要为您的列表创建一个控制器并向 post 添加一个静态方法:

final class ListingController {
    static func post(request: Request) throws -> EventLoopFuture<YourModel> {
        let model = try request.content.decode(YourModel.self)
        return model.create(on: request.db)
            .map { model }
    }
}

然后直接传给方法:

app.on(.POST, "listings", body: .collect(maxSize: "1mb"), use: ListingController.post)

不要忘记注册您的控制器 (RouteCollection)。

您遇到的问题是您的虚拟路由处理程序没有 return 任何东西。您必须在路由处理程序中 return 某事 ,即使它只是一个 HTTP 状态,这就是您看到的错误。

如果你 return 一个字符串或模型等,它会让编译器满意。

经过多次尝试。我终于找到了适合我的情况的正确方法。

func boot(routes: RoutesBuilder) throws {
    let listingRoutes = routes.grouped("api", "listings")
    listingRoutes.on(.POST, body: .collect(maxSize: "10mb"), use: postHandler)
}