javascript-Express / Mongoose路由器:对于路径“ _id”的值“ undefined”,未能成功转换到ObjectId
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript-Express / Mongoose路由器:对于路径“ _id”的值“ undefined”,未能成功转换到ObjectId,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3909字,纯文字阅读大概需要6分钟。
内容图文
![javascript-Express / Mongoose路由器:对于路径“ _id”的值“ undefined”,未能成功转换到ObjectId](/upload/InfoBanner/zyjiaocheng/691/29504577f5414c9f9cedfdc973f933f1.jpg)
我在Express中有一个简单的API,允许用户将帖子标题“发布”和“删除”到MongoDB数据库中.出于某种原因,当我添加一个帖子标题,然后“删除”它时,我在路径“ _id”处获得“对ObjectId的转换失败,值“未定义”.
创建帖子后,当我调用“删除”时,似乎不存在“ _id”.但是,当我刷新页面,然后单击“删除”时,它会很好地获得“ _id”并删除条目.
我在路由中做错了什么,没有生成“ _id”并且无法立即将其从帖子中拉出吗?
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
});
});
}
};
解决方法:
在addPostItem中,您可以在进行POST调用之前将帖子添加到模型的客户端列表中.您推送到posts数组中的新创建的post将没有_id,因为它是在服务器上生成的,不会返回.当您将此新帖子传递给服务器一个未定义的_id到服务器时,对其进行的任何api调用都将失败,并显示相同的错误.
刷新页面并调用get函数时,所有帖子均带有_id,因此一切正常.
遵循的典型模式是在创建帖子时将创建的ID(或整个帖子)返回给客户端,然后将其添加到您的items数组中(如下所示):
function addPostItem(post){
triggerListeners();
helper.post("/api/posts", post, function(res){
posts.push(res.data);
});
}
您还需要重写POST请求以返回创建的实体:
post.save(function(err) {
if (err)
return res.status(300).send(err, o);
res.json(o);
});
一种变化是仅返回._id.另一个方法是在客户端上创建ID,但随后您将失去本机mongo ObjectId的某些优势.
内容总结
以上是互联网集市为您收集整理的javascript-Express / Mongoose路由器:对于路径“ _id”的值“ undefined”,未能成功转换到ObjectId全部内容,希望文章能够帮你解决javascript-Express / Mongoose路由器:对于路径“ _id”的值“ undefined”,未能成功转换到ObjectId所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。