2017-02-02 6 views
1

私は蒸気に慣れていません。私はこのチュートリアルに従っています:https://www.xplusz.com/how-to-do-basic-crud/しかし、私はpostgresqlデータベースの代わりにMySQLデータベースを使用しています。Fluent.EntityErrorエラー0

だから、これは私が持っているコードです: Patient.swift

import Foundation 
import Vapor 
import Fluent 


final class Patient: Model { 

    var id: Node? 
    var firstName: String 
    var lastName: String 
    var exists: Bool = false 

    init(firstName: String, lastName: String) { 
    self.id = nil 
    self.firstName = firstName 
    self.lastName = lastName 
    } 

    init(node: Node, in context: Context) throws { 
    id = try node.extract("id") 
    firstName = try node.extract("first_name") 
    lastName = try node.extract("last_name") 
    } 

    func makeNode(context: Context) throws -> Node { 
    return try Node(node: [ 
     "id": id, 
     "first_name": firstName, 
     "last_name": lastName 
     ]) 
    } 

    static func prepare(_ database: Database) throws { 
    try database.create("patients") { users in 
     users.id() 
     users.string("first_name") 
     users.string("last_name") 
    } 
    } 

    static func revert(_ database: Database) throws { 
    try database.delete("patients") 
    } 

} 

main.swift

import Vapor 
import VaporMySQL 

let drop = Droplet(
    providers:[VaporMySQL.Provider.self] 
) 

drop.get { req in 
    return try drop.view.make("welcome", [ 
     "message": drop.localization[req.lang, "welcome", "title"] 
    ]) 
} 


drop.get("version"){request in 
    if let db = drop.database?.driver as? MySQLDriver{ 
    let version = try db.raw("SELECT version()") 
    return try JSON(node: version) 
    }else{ 
    return "No db connection" 
    } 
} 

drop.post("patients") { request in 
    print(request.json) 
    var patient = try Patient(node: request.json) 
    try patient.save() 
    return patient 
} 

drop.get("patients"){request in 
    return try JSON(node: Patient.all().makeNode()) 
} 




drop.resource("posts", PostController()) 

drop.run() 

私はバージョンを実行すると、すべてが正常に動作します:

[ 
    { 
    "version()": "5.7.14" 
    } 
] 

しかし、たとえば、投稿を実行したりリクエストを受け取った場合、エラーが表示されます。 enter image description here

このチュートリアルでは、まずデータベースにテーブルを作成することについては言及していませんが、準備機能の内容は正しいですか?他に何が間違っていますか?

mysql.json

{ 
    "host": "localhost", 
    "user": "root", 
    "password": "", 
    "database": "development", 
    "port": "3306", 
    "encoding": "utf8" 
} 

答えて

1

私は、この変換を命名に関連する問題であると思います。郵便配達であなたは「firstNameの」&「lastNameの」という名前のパラメータを送信しているし、あなたのモデルクラスで使用すると、アンダースコア「FIRST_NAME」&「LAST_NAME」のように分離されているパラメータを使用している、あなたは、同じ名前の変換に従うべきです。

アップデート: -

方法の下で試してみて、それでもこのエラーに直面しているなら、私に知らせてください。

guard let first_name = request.data["first_name"]?.string, let last_name = request.data["last_name"]?.string else { 
     return try JSON(node:[ 
      "error": true, 
      "message": "first_name or last_name not found" 
      ]) 
    } 

    var patient = Patient(firstName: first_name, lastName: last_name) 
    do { 
     try patient.save() 

     return try JSON(node:[ 
      "error" : false, 
      "message" : "patient added successfully" 
      ]) 

    } catch let error{ 
     return try JSON(node:[ 
      "error" : true, 
      "message" : "\(error)" 
      ]) 
    } 

アップデート2: -

1つのプロバイダを追加し、使用する前に、データベースを準備する必要があります。

try drop.addProvider(VaporMySQL.Provider.self) 
drop.preparations = [Patient.self] 
+0

first_nameとlast_nameに変更して同じエラーが発生しました – user2529173

+0

ハードコードされた値で試しましたか? –

+2

これは、 'first_name'を抽出しようとしている' init(node:Node ...) 'メソッドに最も関連していますが、JSON本体に' firstName'が含まれています。キーは正確に一致する必要があります。 – tanner0101

関連する問題