2

我正在使用 Vapor Fluent 实现删除路由处理程序。

对于这个处理程序,我想验证user发送产品删除请求是 的所有者,product否则Abort请求。

func deleteHandler(_ req: Request) throws -> EventLoopFuture<HTTPStatus> {
    let user = req.auth.get(User.self)
    return Product.find(req.parameters.get("productID"), on: req.db)
        .unwrap(or: Abort(.notFound))
        .flatMap { product in
            return product.$user.get(on: req.db).flatMapThrowing { owner in
                guard try user?.requireID() == owner.requireID() else {
                    throw Abort(.forbidden)
                }
                return try product.delete(on: req.db)
                    .transform(to: HTTPStatus.noContent) // error here
            }
        }
}

但是 Vapor 在return try product.delete(on: req.db).transform(to: HTTPStatus.noContent)Cannot convert return expression of type 'EventLoopFuture<HTTPResponseStatus>' to return type 'HTTPStatus' (aka 'HTTPResponseStatus').

我尝试使用 再次链接map({}),但没有帮助。使用wait()解决了错误,但引入了运行时错误。

谢谢你的帮助!

4

1 回答 1

3

问题是它.flatMapThrowing没有抛出未来。requireID()在这种情况下是矫枉过正的。如果您throw按如下方式替换并删除Throwing它,它应该可以工作:

func deleteHandler(_ req: Request) throws -> EventLoopFuture<HTTPStatus> {
    let user = req.auth.get(User.self)
    return Product.find(req.parameters.get("productID"), on: req.db)
        .unwrap(or: Abort(.notFound))
        .flatMap { product in
            return product.$user.get(on: req.db).flatMap { owner in
                guard user?.id == owner.id else {
                    return request.eventLoop.makeFailedFuture( Abort(.forbidden))
                }
                return product.delete(on: req.db)
                    .transform(to: HTTPStatus.noContent)
            }
        }
}

我已经trydelete后面删除了。我猜编译器没有报告这是不必要的,因为早期的错误,但通常不需要。如果是这样,我的答案将非常失败!

于 2021-09-01T05:25:54.013 回答