2015-09-14 129 views
0

我正在玩游戏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。任何帮助将不胜感激。

回答

1

我不能尝试你的代码,所以我必须编译它在我心中。这就是说,在我看来,这个问题是在这里:

request.body.validate[MessageThread].flatMap { message => 
    create(message).flatMap { created => 
     updateMessage(request.body \ "messageId").flatMap { updated => 
     Created 
     } 
    } 
} 

取而代之的是第三flatMap的尝试map,具体如下:

request.body.validate[MessageThread].flatMap { message => 
    create(message).flatMap { created => 
     updateMessage(request.body \ "messageId").map { updated => 
     Created 
     } 
    } 
} 

实际上,因为它似乎没有你使用createdupdated你可以只使用:

request.body.validate[MessageThread].flatMap { message => 
    create(message).flatMap { _ => 
     updateMessage(request.body \ "messageId").map { _ => 
     Created 
     } 
    } 
} 

如果你愿意,你可以使用一个相等的理解:

for { 
    message <- request.body.validate[MessageThread] 
    _ <- create(message) 
    _ <- updateMessage(request.body \ "messageId") 
} yield Created 
+0

它还没有工作。现在扔 类型不匹配; 找到:scala.concurrent.Future [controllers.Messages.Status] 必需:play.api.libs.json.JsResult [?] –

+0

您需要用JSON响应。我建议你完全自上而下地阅读游戏文档,如果你没有时间尝试在这里找出它:https://www.playframework.com/documentation/2.3.x/ScalaJsonHttp – lambdista