Enrutador Express / Mongoose: 'Falló la conversión a ObjectId para el valor “undefined” en la ruta “_id”'
Tengo una API simple en Express que permite al usuario 'publicar' y 'eliminar' un título de publicación en una base de datos MongoDB. Por alguna razón, cuando agrego un título de publicación y luego lo 'borro', aparece el mensaje "Falló la conversión de ObjectId" por el valor "undefined" en la ruta "_id".
Parece que el "_id" no existe cuando llamo 'eliminar' después de crear la publicación. Sin embargo, cuando actualizo la página, luego hago clic en 'eliminar', obtiene el "_id" perfectamente bien y elimina la entrada.
¿Estoy haciendo algo mal en el enrutamiento para que el "_id" no se genere y pueda ser retirado de la publicación de inmediato?
module.exports = function(router) {
var Post = require('../models/post.js');
// middleware for the api requests
router.use(function(req, res, next) {
// do logging
console.log('something is happening.');
next(); // make sure we go to our next route and don't stop here
});
// test route to make sure everything is working (accessed at GET http://localhost:8080/api)
router.get('/', function(req, res) {
res.json({ message: 'hooray! welcome to our api!' });
});
// all routes here
// routes that end in /posts
router.route('/posts')
// create a Post (accessed at POST http://localhost:7777/api/posts)
.post(function(req, res) {
var post = new Post();
post.postTitle = req.body.postTitle; // set the post name (comes from request)
console.log(post._id);
// save post and check for errors
post.save(function(err) {
if (err)
return res.status(300).send(err);
res.json({ message: 'post created!' });
});
})
// get all Posts (accessed at GET http://localhost:7777/api/posts)
.get(function(req, res) {
Post.find(function(err, posts) {
if (err)
return res.send(err);
res.json(posts);
});
});
// routes that end in /posts for specific id
router.route('/posts/:post_id')
// get the post with that id
.get(function(req, res) {
Post.findById(req.params.post_id, function(err, post) {
if (err)
return res.send(err);
res.json(post);
});
})
// update the post with that id
.put(function(req, res) {
Post.findById(req.params.post_id, function(err, post) {
if (err)
return res.send(err);
post.postTitle = req.body.postTitle;
// save the post
post.save(function(err) {
if (err)
return res.send(err);
res.json({ message: 'post updated!' });
});
});
})
// deletes the post with that id
.delete(function(req, res) {
Post.findOne({
_id:req.params.post_id
}).remove(function(x){
console.log("removed: ", x);
});
})
.patch(function(req, res) {
Post.findOne({
_id: req.body._id
}, function(err, doc) {
for (var key in req.body) {
dock[key] = req.body[key];
}
doc.save();
res.status(200).send();
});
});
}
/
function addPostItem(post){
posts.push(post);
triggerListeners();
helper.post("/api/posts", post);
}
function deletePost(post) {
var index = posts.indexOf(post);
console.log(post);
posts.splice(index, 1);
triggerListeners();
helper.del('api/posts/' + post._id);
}
/
var $ = require('jquery');
module.exports = {
get: function(url) {
return new Promise(function(success, error) {
$.ajax({
url: url,
dataType: 'json',
success: success,
error: error
});
});
},
post: function(url, data) {
return new Promise(function(success, error) {
$.ajax({
url: url,
type: 'POST',
data: data,
success: success,
error: error
});
});
},
patch: function(url, data) {
return new Promise(function(success, error) {
$.ajax({
url: url,
type: 'PATCH',
data: data,
success: success,
error: error
});
});
},
del: function(url) {
return new Promise(function(success, error) {
$.ajax({
url: url,
type: 'DELETE',
success: success,
error: error
});
});
}
};