TypeError:无法读取属性' save'为null

时间:2017-01-24 20:55:09

标签: node.js swift mongodb

我试图将一些数据输入到我写过的小型节点服务器上。

服务器端的代码如下:

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);
    })
}
});
    })

我收到回复:

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

但是,数据未更新。任何人都可以看到我在保存中出错的地方吗?

当我使用邮递员PUT时,这一切都很顺利,我可以保存,但是,当我从iOS尝试PUT时,我得到:

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)

快速代码是:

   @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()
           }

提前致谢!

1 个答案:

答案 0 :(得分:0)

我看到一个错误,但不太可能解决您的问题是您应该在第一个if语句子句中执行res.json(response);

另一件需要注意的事情是,无论是否提供save值,您都在调用req.body.LockID,因此如果不是,则保存用户而不进行任何修改。您可能希望打印出值req.body.LockID,因为这可能是用户电子邮件未更新的原因。