我正在玩游戏2.3,我想在插入另一个集合时更新集合。下面是抛出错误的代码。
def create(message : MessageThread) : Future[reactivemongo.core.commands.LastError] = {
collectionThread.insert(message.copy(
createDate = Some(new DateTime()),
updateDate = Some(new DateTime())
))
}
def updateMessage(messageId : JsValue) : Future[reactivemongo.core.commands.LastError] = {
collection.update(Json.obj("_id" -> (Json.obj("$oid" -> messageId))),
Json.obj("$set" -> Json.obj("isRead" -> false,
"lastRepliedDate" -> Some(new DateTime()))))
}
def createThread = Action.async(parse.json) { request =>
request.body.validate[MessageThread].flatMap { message =>
create(message).flatMap { created =>
updateMessage(request.body \ "messageId").flatMap{ updated =>
Created
}
}
}.getOrElse(Future.successful(BadRequest("invalid json")))
}
我正在调用update并从createThread创建。我无法将结果发回
错误如下
type mismatch;
found : controllers.Messages.Status
required: scala.concurrent.Future[?]
我还在学习scala
时还早。任何帮助将不胜感激。
答案 0 :(得分:1)
I cannot try your code so I have to compile it in my mind. That said, it seems to me the problem is here:
request.body.validate[MessageThread].flatMap { message =>
create(message).flatMap { created =>
updateMessage(request.body \ "messageId").flatMap { updated =>
Created
}
}
}
Instead of the third flatMap
try map
, as follows:
request.body.validate[MessageThread].flatMap { message =>
create(message).flatMap { created =>
updateMessage(request.body \ "messageId").map { updated =>
Created
}
}
}
Actually, since it does not seem you're using created
and updated
you could just use:
request.body.validate[MessageThread].flatMap { message =>
create(message).flatMap { _ =>
updateMessage(request.body \ "messageId").map { _ =>
Created
}
}
}
If you prefer you could use an equivalent for comprehension:
for {
message <- request.body.validate[MessageThread]
_ <- create(message)
_ <- updateMessage(request.body \ "messageId")
} yield Created