2017-01-24 11 views
0

Ich versuche, einige Daten auf einen kleinen Knoten-Server zu schreiben, den ich geschrieben habe.TypeError: Kann die Eigenschaft 'save' von null nicht lesen

Der Code auf der Serverseite ist wie folgt:

router.route('/returnLockID').put(function(req, res){ 
mongoOp.findOne({ 
    name: req.body.name 
}, function(err, user) { if(err) { 
    response = {"error" : true,"message" : "Error fetching data"}; 
} else { 
// we got data from Mongo. 
// change it accordingly. 
    if(req.body.LockID !== undefined) { 
     // case where ID needs to be updated. 
     user.LockID = req.body.LockID; 
    } 
    // save the data 
    user.save(function(err){ 
     if(err) { 
      response = {"error" : true,"message" : "Error updating data"}; 
     } else { 
      response = {"error" : false,"message" : "Data is updated for "+req.body.name}; 
     } 
     res.json(response); 
    }) 
} 
}); 
    }) 

ich die Antwort erhalten:

{ 
    "error": false, 
    "message": "Data is updated for nv942" 
} 

jedoch werden die Daten nicht aktualisiert. Kann jemand sehen, wo ich mit dem Sparen falsch liege?

Alles durch feine geht, wenn ich Postbote PUT verwenden, kann ich sparen, aber wenn ich versuche, PUT von iOS erhalte ich:

TypeError: Cannot read property 'save' of null 
    at /Users/NikhilVedi/Documents/FYP/Server/lockserver/routes/users.js:92:13 
    at Query.<anonymous> (/Users/NikhilVedi/Documents/FYP/Server/lockserver/node_modules/mongoose/lib/model.js:3407:16) 
    at /Users/NikhilVedi/Documents/FYP/Server/lockserver/node_modules/kareem/index.js:259:21 
    at /Users/NikhilVedi/Documents/FYP/Server/lockserver/node_modules/kareem/index.js:127:16 
    at _combinedTickCallback (internal/process/next_tick.js:67:7) 
    at process._tickCallback (internal/process/next_tick.js:98:9) 

Der SWIFT-Code ist:

@IBAction func setup(_ sender: Any) { 

     if (UserDefaults.standard.value(forKey: "userIP") == nil) 
     { 
      //make this a message box and stop the program crashing by assigning user defaults a value 
      UserDefaults.standard.set("localhost", forKey: "userIP") 

      print("Local host programatically set"); 
     } 

     let u = UserDefaults.standard.value(forKey: "userIP")! 
     let name = UserDefaults.standard.value(forKey: "email")! 
     var request = URLRequest(url: URL(string: "http://\(u):3000/users/returnLockID")!) 
     request.httpMethod = "PUT" 
     let postString = "LockID=\(LockID.text!)name=\(name)" 
     print(postString) 
     request.httpBody = postString.data(using: .utf8) 
     let task = URLSession.shared.dataTask(with: request) { data, response, error in 
      guard let data = data, error == nil else {             // check for fundamental networking error 
       print("error=\(error)") 
       return 
      } 

      if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {   // check for http errors 
       print("statusCode should be 200, but is \(httpStatus.statusCode)") 
       print("response = \(response)") 
      } 

      let responseString = String(data: data, encoding: .utf8) 
      // print("responseString = \(responseString)") 

      if let data = responseString?.data(using: String.Encoding.utf8) { 
       let resString = JSON(data: data) 

       if resString["success"].stringValue == "true" 
       { 
        print("works"); 

       } 
       else if resString["success"].stringValue == "false" 
       { 
        print("failed") 
        print(resString["message"].stringValue) 
        //dismiss window and set bool to true 
        UserDefaults.standard.set(true, forKey: "LockIDPresent") 
        self.dismiss(animated: true, completion: nil); 
       } 

      } 

     } 
    task.resume() 
      } 

Dank im Voraus!

Antwort

0

Ein Fehler Ich sehe, aber nicht die Lösung für Ihr Problem ist, dass Sie res.json(response); in der ersten if-Anweisung Klausel tun sollten.

Eine andere Sache zu beachten ist, dass Sie save aufrufen, unabhängig davon, ob ein req.body.LockID Wert zur Verfügung gestellt wird, so dass in Fällen, in denen es nicht gespeichert ist, der Benutzer ohne jede Änderung gespeichert wird. Möglicherweise möchten Sie den Wert req.body.LockID ausdrucken, da dies möglicherweise der Grund dafür ist, dass die Benutzer-E-Mail nicht aktualisiert wird.

+0

zusätzlich ordnet er die E-Mail nicht die LockId des Körpers 'user.LockID = req.body.userEmail;' –

+0

Ja, ich habe das gesehen, aber nicht erwähnt, da ich nicht mit seinem Geschäft vertraut bin Logik, so dass es absichtlich sein könnte ... nicht sicher. – GPicazo

+0

Danke! Ich kann jetzt PUT und speichern erfolgreich über Postman, aber in swift bekomme ich einen Fehler. Ich habe die Frage aktualisiert. – CS456

Verwandte Themen