如何在Future中获取securesocial.currentUser?附相关实现代码
你的代码目前存在一个关键问题:SecureSocial.currentUser本身返回的是Future[Option[YourProfileType]],而你在map回调里又返回了Future.successful(user),这会让整个方法的返回类型变成Future[Future[User]],而非你期望的Future[User]。下面分两种常见情况给出修正方案:
情况1:UserAccessor.finduserbyid是同步方法
如果finduserbyid是直接返回User实例的同步方法,你可以直接在map里返回用户对象,不需要额外包装成Future:
def getUser(implicit request: play.api.mvc.Request[Any], env: MyEnvironment): Future[User] = { SecureSocial.currentUser.map { maybeUser => val userId = maybeUser.map(_.main.userId).getOrElse("unknown") UserAccessor.finduserbyid(userId) } }
如果后续有改成异步逻辑的计划,也可以用flatMap提前适配:
def getUser(implicit request: play.api.mvc.Request[Any], env: MyEnvironment): Future[User] = { SecureSocial.currentUser.flatMap { maybeUser => val userId = maybeUser.map(_.main.userId).getOrElse("unknown") val user = UserAccessor.finduserbyid(userId) Future.successful(user) } }
情况2:UserAccessor.finduserbyid是异步方法(返回Future[User])
如果finduserbyid本身是异步操作(比如查询数据库),返回Future[User],那必须用flatMap来扁平化嵌套的Future结构:
def getUser(implicit request: play.api.mvc.Request[Any], env: MyEnvironment): Future[User] = { SecureSocial.currentUser.flatMap { maybeUser => val userId = maybeUser.map(_.main.userId).getOrElse("unknown") UserAccessor.finduserbyid(userId) // 此方法返回Future[User] } }
额外建议:处理未知用户的边界情况
你当前用"unknown"作为默认用户ID,但如果finduserbyid("unknown")无法找到对应用户,可能会返回null或抛出异常。建议优化这个逻辑,比如返回Option[User]来明确表示用户可能不存在:
// 同步finduserbyid返回Option[User]的情况 def getUser(implicit request: play.api.mvc.Request[Any], env: MyEnvironment): Future[Option[User]] = { SecureSocial.currentUser.map { maybeUser => maybeUser.flatMap(profile => UserAccessor.finduserbyid(profile.main.userId)) } } // 异步finduserbyid返回Future[Option[User]]的情况 def getUser(implicit request: play.api.mvc.Request[Any], env: MyEnvironment): Future[Option[User]] = { SecureSocial.currentUser.flatMap { case Some(profile) => UserAccessor.finduserbyid(profile.main.userId) case None => Future.successful(None) } }
内容的提问来源于stack exchange,提问作者tommy sun
相关产品推荐
相关产品推荐

