无法获得PUT在Nodejs / express上工作

我一直在写我的第一个节点应用程序,一个rest的API。 我已经有一切工作很好,但PUT将永远不会经过。 我已经尝试了很多不同的组合,很多较老的教程和一些新的,我可能很接近,我只是不确定如何更新logging。 另外,如果你看到任何东西跳出来,请随时让我知道! 我真的喜欢节点,所以我很乐意学习最佳实践。

下面是我的表的路线,所有其他端点工作正常。 如果您有任何问题,请告诉我。

//Database var mongoose = require("mongoose"); mongoose.connect('mongodb://Shans-MacBook-Pro.local/lantern/'); // Schema var Schema = mongoose.Schema; var Person = new Schema({ first_name: String, last_name: String, address: { unit: Number, address: String, zipcode: String, city: String, region: String, country: String }, image: String, job_title: String, created_at: { type: Date, default: Date.now }, active_until: { type: Date, default: null }, hourly_wage: Number, store_id: Number, employee_number: Number }); var PersonModel = mongoose.model('Person', Person); // Return all people exports.allPeople = function(req, res){ return PersonModel.find(function (err, person) { if (!err) { return res.send(person); } else { return res.send(err); } }); } // Create A Person exports.createPerson = function(req, res){ var person = new PersonModel({ first_name: req.body.first_name, last_name: req.body.last_name, address: { unit: req.body.address.unit, address: req.body.address.address, zipcode: req.body.address.zipcode, city: req.body.address.city, region: req.body.address.region, country: req.body.address.country }, image: req.body.image, job_title: req.body.job_title, hourly_wage: req.body.hourly_wage, store_id: req.body.location, employee_number: req.body.employee_number }); person.save(function (err) { if (!err) { return console.log("created"); } else { return res.send(err); } }); return res.send(person); } // Return person by id exports.personById = function (req, res){ return PersonModel.findById(req.params.id, function (err, person) { if (!err) { return res.send(person); } else { return res.send(err); } }); } // Delete a person by id exports.deletePerson = function (req, res){ return PersonModel.findById(req.params.id, function (err, person) { return person.remove(function (err) { if (!err) { console.log("removed"); } else { return res.send(err); } }); }); } // Update a person by id exports.updatePerson = function(req, res){ var person = new PersonModel({ first_name: req.body.first_name }); var upsertData = person.toObject(); console.log(req.params.id); // OK delete upsertData.id; person.update({ _id: req.params.id }, upsertData, { multi: false }, function(err) { if(err) { throw err; } console.log('updated visit: '+ req.params.id); res.redirect('/'); }); } 

我的app.js

 // Node Modules var express = require('express'); var app = express(); app.port = 3000; // Routes var people = require('./routes/people'); // Node Configure app.configure(function(){ app.use(express.bodyParser()); app.use(app.router); }); // Start the server on port 3000 app.listen(app.port); /********* ENDPOINTS *********/ // People app.get('/people', people.allPeople); // Return all people app.get('/people/:id', people.personById); // Return person by id app.post('/people', people.createPerson); // Create A Person app.put('/people/:id', people.updatePerson); // Update a person by id, not working app.delete('/people/:id', people.deletePerson); // Delete a person by id // Logs // - Build some logs here for info when the server is going. // - routes that are loaded, any activity that might be helpful console.log('Server started on port ' + app.port); 

最后,把json的错误放在

 { "name": "MongoError", "err": "Mod on _id not allowed", "code": 10148, "n": 0, "connectionId": 91, "ok": 1 } 

保持它,并最终弄清楚了! 这是我的PUTfunction。

 app.put('/people/:id', function (req, res) { var person = new PeopleModel({ first_name: req.body.first_name, last_name: req.body.last_name, // etc etc }); var upsertData = person.toObject(); delete upsertData._id; return PeopleModel.update({ _id: req.params.id }, upsertData, {upsert: true}, function(err) { if (!err) { return res.send("updated"); } else { console.log(err); return res.send(404, { error: "Person was not updated." }); } }); }); 

我将尝试弄清楚如何自动检测哪些字段需要更新,就像testing我存储的一个变种一样。