Как сказал @nathan, это связано с тем, что ваш код асинхронный.Ваш .map
обратный вызов похож на замыкание, которое вы передаете URLSession.dataTask
, когда делаете запрос к внешнему API для приложения iOS.
Vapor использует немного другую асинхронную модель, чем та, которую вы используете в iOS, хотя,используя обещания и фьючерсы вместо закрытия обратного вызова.Вы можете прочитать о них в документации .
. В вашем случае вы хотите вернуть userID
, полученное из запроса AccessToken
.Для этого сначала нужно изменить тип возвращаемого значения вашего метода с Int
на Future<Int>
.Затем, вместо присвоения результата вызова .map
для _
, вы можете вернуть его из метода:
func checkAccessToken(req: Request) -> Future<Int> {
let bearerAuthorization = req.http.headers.bearerAuthorization
guard let _bearerAuthorization = bearerAuthorization else {
return req.future(0)
}
return AccessToken.query(on: req).filter(\.accessToken == _bearerAuthorization.token).first().map(to: Int.self) { queriedAccessToken in
return queriedAccessToken!.userID!
}
}
Я бы посоветовал вам изучить обработку ошибок для queriedAccessToken
и userID
значений, чтобы вам не пришлось их распаковывать принудительно.