2017-04-26 8 views
2

Ich benutze Vapor um eine einfache Web App zu schreiben. Ich habe eine Entität, um Sitzungsinformationen in einer Datenbank zu speichern. Der Code für diese Einheit ist wie folgt:Warum schlägt meine Vapor-Abfrage immer fehl?

struct SessionToken: Model{ 
    var exists: Bool = false 
    var id: Node? 
    var username: String 
    var accessToken: String 
    var expiryDate: String 

    init(username: String, accessToken: String, expiryDate: String) { 
     self.username = username 
     self.accessToken = accessToken 
     self.expiryDate = expiryDate 
    } 

    init(node: Node, in context: Context) throws { 
     try self.id = node.extract("id") 
     try self.username = node.extract("username") 
     try self.accessToken = node.extract("accessToken") 
     try self.expiryDate = node.extract("expiryDate") 
    } 


    func makeNode(context: Context) throws -> Node { 
     let sessionToken = try Node(node:["id": id, "username": username, "accessToken": accessToken, "expiryDate": expiryDate]) 
     return sessionToken 
    } 


    static func prepare(_ database: Database) throws { 
     try database.create("sessiontokens"){ sessiontokens in 
      sessiontokens.id() 
      sessiontokens.string("username") 
      sessiontokens.string("accessToken") 
      sessiontokens.string("expiryDate") 

     } 
    } 

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

} 

ich einige gefälschte Informationen in die Datenbank eingeben, aber wenn ich die Datenbank mit dem folgenden Code-Abfrage:

let token = try SessionToken.query().filter("username", "[email protected]").first() 

Ich erhalte eine Fehlermeldung: Could not initialize SessionToken, skipping: unableToConvert(node: nil, expected: "String")

Die lustige Sache ist, dass, wenn ich SessionToken durch eine andere Entität im Projekt ersetzen, funktioniert der Code ganz gut. Die einzige Entität, die ich Probleme habe, irgendwelche Informationen von der Datenbank zu holen ist SessionToken und es hat mich seit letzter Nacht frustriert!

Ich würde es wirklich schätzen, wenn mir jemand in die richtige Richtung zeigen könnte, um dieses Problem zu lösen.

P.S. Ich benutze Postgres.

Antwort

3

Ich habe die Ursache des Problems gefunden. Wie in dem Fehler Could not initialize SessionToken erwähnt, gibt es ein Problem mit der Initialisierung der Entität. Postgres erstellt Spaltennamen mit allen Kleinbuchstaben. Wenn Sie also eine "accessToken" -Spalte erstellen, wird diese als "accesstoken" in der Tabelle ohne das Großbuchstabe T gespeichert. Wie Sie sehen, frage ich die Tabelle mit "accessToken" ab Spalte existiert; Die Ursache des Problems lag daher in der Benennung von Diskrepanzen zwischen der Tabelle und der Abfrage.

Sie können mehr über die Groß-/Kleinschreibung von Postgres hier lesen: Are PostgreSQL column names case-sensitive?

Verwandte Themen