简单操作后播放框架数据库操作

Play framework db action after simple action

所以,基本上我想用 play 框架做的是:

  1. 检查用户是否已登录 cookie
  2. 如果用户登录cookie从数据库中获取记录

代码:

def allSamplesJson = Action { implicit request =>
  request.session.get("l").map { value =>
    value match {
      case "i" => DBAction { conn =>
        implicit val dbs = conn.dbSession
        val all = models.CodeSampleTable.allSamples()
        Ok(Json.toJson(all))
      }
      case _ => Unauthorized(unautStr)
    }
  }.getOrElse {
    Unauthorized(unautStr)
  }
}

基本上,如果用户无权获取 json 记录,我什至不想接触 database/open 连接等。上面的代码不起作用(无法编译)。我该如何实现?

这是错误:

你不能像那样将 DBAction 包裹在另一个 Action 中,因为 DBAction 不会 return Result,它可能 return 类似于 Action[A]。这意味着您正在尝试 return 更高级别 ActionResultAction[A])中的混合类型,因此编译器将 return 类型推断为是 Object,当它应该是 Result.

正如@Mikesname 所建议的,您需要将 DBAction 替换为 DB.withSession,这将提供您需要的数据库会话,并允许您 return 正确的类型:

DB.withSession { conn =>
    val all = models.CodeSampleTable.allSamples()
    Ok(Json.toJson(all))
}