[英]Play Framework Controller Handling Multiple Futures
I have a Play controller that takes in a Model object that comes in from the user interface. 我有一个Play控制器,它接收来自用户界面的Model对象。 This model object is a User that I'm trying to insert into the database.
这个模型对象是我要插入数据库的用户。 But before I insert this User in the table, I check if there is a duplicate user that already exist for the given EMail address.
但是在将该用户插入表中之前,请检查给定电子邮件地址是否存在重复的用户。 If yes, I reject the request and if not I insert.
如果是,我拒绝请求,如果不插入。 I'm using Slick and Play framework and here is my controller code:
我正在使用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 ]]
)
}
I do not see anything wrong with this approach, but my compiler is not happy. 我看不到这种方法有什么问题,但是我的编译器并不满意。 It complaints at Line X as:
它在X线抱怨为:
Expression of type Future[Object] does not confirm to the expected type _X
What is actually the problem here? 这实际上是什么问题?
Btw shouldn't you use flatMap
instead of map here? 顺便说一句,您不应该在这里使用
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
right? registerNewUser
返回Future
权利?
Maybe like this: 也许是这样的:
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}"))
}
? ?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.