Как вставить запись в MySQL с уникальным значением столбца, используя скользкий API в рамках игры

Я новичок в Scala-Play Framework. Я использую Play Framework 2.5 и Play-Slick 1.1.1. Я запутался в типе возврата Future при использовании Action для обработки запроса. Я получаю эту ошибку:

найдено: scala.concurrent.Future [play.api.mvc.Result] обязательно: play.api.mvc.Result

в моем registerUser метод.

Это мое registerUser метод

def registerUser = Action.async { implicit request =>

registerForm.bindFromRequest.fold(

  errorForm => {
    Future.successful(Ok(views.html.registration(errorForm)))
  },

  user => {
    userDal.isExists(user.email).map { isExists =>

      if(isExists.booleanValue() == false){
        Redirect(routes.UserController.login()).flashing("message"->"Invalid Credential")
      }
      **else{
          userDal.registerUser(user.firstname, user.lastname, user.email, user.password, user.address).map { _ =>

          Redirect(routes.ProductController.index()).withSession("username" -> user.firstname)
        }**
      }
    }
  }
 )
}

Вот моя проекция таблицы и метод для вставки данных в пользовательскую таблицу. В таблице "пользователь" столбец "электронная почта" помечен как уникальный.

Таблица:

private class UserDB(tag: Tag) extends Table[User](tag, "user") {

def id = column[Option[Int]]("id", O.PrimaryKey, O.AutoInc)

def firstname = column[String]("firstname")

def lastname = column[String]("lastname")

def email = column[String]("email")

def password = column[String]("password")

def addr = column[String]("address")

override def * = (id, firstname, lastname, email, password, addr) <> ((User.apply _).tupled, User.unapply)
}

метод для вставки в пользовательскую таблицу

def registerUser(fname: String, lname: String, email: String, password: String, addr: String): Future[User] = db.run {

(userTable.map(u => (u.firstname, u.lastname, u.email, u.password, u.addr))

  returning userTable.map(_.id)
  // And we define a transformation for the returned value, which combines our original parameters with the

  into ((column, id) => User(id, column._1, column._2, column._3, column._4, column._5))) += (fname, lname, email, password, addr)
}

У меня также есть способ проверить, существует ли пользователь с таким же адресом электронной почты или нет. Вот метод

def isExists(email: String): Future[Boolean] = db.run{

userTable.filter(_.email === email).exists.result
}

Если я не проверяю существующую электронную почту с помощью метода isExists, тогда он выдает SQLException для уникальных ограничений.

Заранее большое спасибо.

1 ответ

Ошибка вызвана использованием map на userDal.isExists(user.email), if / else заявление порождает Future[Redirect], но map вызову нужен экземпляр Redirect,

В этом случае самое простое решение - заменить map с flatMap, который ожидает экземпляр Future[Redirect],

Другие вопросы по тегам