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)
}
我正在使用 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)
}