Express/Mongoose 路由器:“由于路径“_id”处的值“未定义”,转换到 ObjectId 失败”

2023-12-14

我在 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 数组的新创建的帖子不会有 _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 ObjectIds 的一些优点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Express/Mongoose 路由器:“由于路径“_id”处的值“未定义”,转换到 ObjectId 失败” 的相关文章

随机推荐