【问题标题】:Play framework db action after simple action简单动作后播放框架数据库动作
【发布时间】:2015-02-11 23:45:57
【问题描述】:

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

  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 记录,我什至不想触摸数据库/打开连接等。上面的代码不起作用(无法编译)。我该如何做到这一点?

这是错误:

【问题讨论】:

  • 不起作用是什么意思?未经授权的用户可以访问吗?授权用户无权访问?抛开问题不谈,我会考虑使用已建立的身份验证系统:stackoverflow.com/questions/24140660/…
  • 我的意思是它不能编译。我只是想这样做,如果用户没有 cookie,他就不会从数据库中获取 json 记录,所以,如果是这种情况,我想完全避免 DB 连接。问题不是“它在语义上不起作用”,问题是它无法编译。我想在简单的 Action 中使用 DBAction
  • 什么是编译错误?
  • @m-z 添加截图到帖子。
  • @VanillaFace 如果您使用的是 Slick,为什么不直接使用 DB wrapper 来获取会话?尝试时无需嵌套操作(由于匹配的一个分支返回 Action[AnyContent] 和另一个 Result,因此无法编译。)

标签: scala playframework


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    相关资源
    最近更新 更多