Play Framework Controller 处理多个 Futures
Play Framework Controller Handling Multiple Futures
我有一个 Play 控制器,它接收来自用户界面的模型对象。这个模型对象是我要插入数据库的用户。但在我将此用户插入 table 之前,我会检查给定的电子邮件地址是否已经存在重复的用户。如果是,我拒绝请求,如果不是,我插入。我正在使用 Slick and Play 框架,这是我的控制器代码:
def registerNewUser(user: User) = {
dbService.registerNewUser(User.toUserRow(user))
.map(userID => Ok(Json.obj("status" -> "ok", "userId" -> userID)))
.recover { case ex => InternalServerError(Json.obj("error" -> s"${ex.getMessage}")) }
}
def createUser() = Action.async(parse.tolerantJson) { request =>
request.body.validate[User].fold(
errors => Future.successful {
BadRequest(Json.obj("status" -> "error", "message" -> JsError.toJson(errors)))
},
user => {
val userExists: Future[Boolean] = dbService.userExists(user.email)
userExists.map(value => {
if (value) UnprocessableEntity(Json.obj("status" -> "error", "message" -> s"user with email ${user.email.toString} already exists"))
else registerNewUser(user)
}).recover {
case ex => InternalServerError(Json.obj("error" -> s"${ex.getMessage}"))
}
} // compilation failure on this line [[ Line X ]]
)
}
我没有发现这种方法有什么问题,但我的编译器不满意。它在 X 行投诉为:
Expression of type Future[Object] does not confirm to the expected type _X
这里的实际问题是什么?
顺便说一句,你不应该在这里使用 flatMap
而不是 map 吗?
userExists.map(value => {
if (value) UnprocessableEntity(Json.obj("status" -> "error", "message" -> s"user with email ${user.email.toString} already exists"))
else registerNewUser(user)
})
registerNewUser
returns Future
对吧?
可能是这样的:
val userExists: Future[Boolean] = dbService.userExists(user.email)
userExists.flatMap(value => {
if (value) Future.successful(UnprocessableEntity(Json.obj("status" -> "error", "message" -> s"user with email ${user.email.toString} already exists")))
else registerNewUser(user)
}).recover {
case ex => InternalServerError(Json.obj("error" -> s"${ex.getMessage}"))
}
?
我有一个 Play 控制器,它接收来自用户界面的模型对象。这个模型对象是我要插入数据库的用户。但在我将此用户插入 table 之前,我会检查给定的电子邮件地址是否已经存在重复的用户。如果是,我拒绝请求,如果不是,我插入。我正在使用 Slick and Play 框架,这是我的控制器代码:
def registerNewUser(user: User) = {
dbService.registerNewUser(User.toUserRow(user))
.map(userID => Ok(Json.obj("status" -> "ok", "userId" -> userID)))
.recover { case ex => InternalServerError(Json.obj("error" -> s"${ex.getMessage}")) }
}
def createUser() = Action.async(parse.tolerantJson) { request =>
request.body.validate[User].fold(
errors => Future.successful {
BadRequest(Json.obj("status" -> "error", "message" -> JsError.toJson(errors)))
},
user => {
val userExists: Future[Boolean] = dbService.userExists(user.email)
userExists.map(value => {
if (value) UnprocessableEntity(Json.obj("status" -> "error", "message" -> s"user with email ${user.email.toString} already exists"))
else registerNewUser(user)
}).recover {
case ex => InternalServerError(Json.obj("error" -> s"${ex.getMessage}"))
}
} // compilation failure on this line [[ Line X ]]
)
}
我没有发现这种方法有什么问题,但我的编译器不满意。它在 X 行投诉为:
Expression of type Future[Object] does not confirm to the expected type _X
这里的实际问题是什么?
顺便说一句,你不应该在这里使用 flatMap
而不是 map 吗?
userExists.map(value => {
if (value) UnprocessableEntity(Json.obj("status" -> "error", "message" -> s"user with email ${user.email.toString} already exists"))
else registerNewUser(user)
})
registerNewUser
returns Future
对吧?
可能是这样的:
val userExists: Future[Boolean] = dbService.userExists(user.email)
userExists.flatMap(value => {
if (value) Future.successful(UnprocessableEntity(Json.obj("status" -> "error", "message" -> s"user with email ${user.email.toString} already exists")))
else registerNewUser(user)
}).recover {
case ex => InternalServerError(Json.obj("error" -> s"${ex.getMessage}"))
}
?