键入不匹配问题

时间:2015-09-14 14:25:41

标签: scala playframework-2.3 reactivemongo

我正在玩游戏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 个答案:

答案 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