Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Mongoose Model.find不是一个函数-在一种情况下失败,在另一种情况下起作用_Node.js_Mongoose_Mongoose Schema_Mongoose Middleware - Fatal编程技术网

Node.js Mongoose Model.find不是一个函数-在一种情况下失败,在另一种情况下起作用

Node.js Mongoose Model.find不是一个函数-在一种情况下失败,在另一种情况下起作用,node.js,mongoose,mongoose-schema,mongoose-middleware,Node.js,Mongoose,Mongoose Schema,Mongoose Middleware,我的数据模型中有两个类似的父子关系树,我正在使用Mongoose的中间件处理级联删除 第一个层次结构表示如下: blogRouter.route('/:blogId') //delete a specific blog by blog id: [OWNER OR ADMIN USER] .delete(Verify.verifyOrdinaryUser, Verify.verifyBlogOwnerOrAdmin, function(req, res, next) { Blog.

我的数据模型中有两个类似的父子关系树,我正在使用Mongoose的中间件处理级联删除

第一个层次结构表示如下:

blogRouter.route('/:blogId')

//delete a specific blog by blog id:    [OWNER OR ADMIN USER]
.delete(Verify.verifyOrdinaryUser, Verify.verifyBlogOwnerOrAdmin, function(req, res, next) {
    Blog.findById(req.params.blogId, function(err, blog) {
        if(err) return next(err);
        blog.remove();
        res.json(blog);
    });
});
forumRouter.route('/:forumId')

//delete forum by id:  [ADMIN]
.delete(Verify.verifyOrdinaryUser, Verify.verifyAdmin, function(req, res, next) {
    Forum.findById(req.params.forumId, function(err, forum) {
        if(err) return next(err);
        forum.remove();
        res.json(forum);
    });
});

在这种情况下,当对blog实例调用remove时,
blog.pre('remove')…
功能执行其预期的操作,并清理blog实例的所有子项。 调用代码如下:

blogRouter.route('/:blogId')

//delete a specific blog by blog id:    [OWNER OR ADMIN USER]
.delete(Verify.verifyOrdinaryUser, Verify.verifyBlogOwnerOrAdmin, function(req, res, next) {
    Blog.findById(req.params.blogId, function(err, blog) {
        if(err) return next(err);
        blog.remove();
        res.json(blog);
    });
});
forumRouter.route('/:forumId')

//delete forum by id:  [ADMIN]
.delete(Verify.verifyOrdinaryUser, Verify.verifyAdmin, function(req, res, next) {
    Forum.findById(req.params.forumId, function(err, forum) {
        if(err) return next(err);
        forum.remove();
        res.json(forum);
    });
});
我对第二层次结构做了完全相同的事情,在这里直观地表示出来:并使用以下代码:

//forum.js

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var User = require('./user.js');
var Post = require('./post.js');
var Subscription = require('./subscription.js');

var Forum = new Schema({
    title: {
        type: String,
        required: true
    },
    description: String,
    moderators: [
        {
            type: Schema.Types.ObjectId,
            ref: 'User'
        }
    ]
}, {
    timestamps: true
});

Forum.pre('remove', function(next) {
    Post.find({"forumId": this._id})
        .exec(function(err, posts) {
            console.log("found posts " + posts);
            for(var i = posts.length -1; i >= 0; i--) {
                posts[i].remove();
            }
        });
    Subscription.remove({"forumId": this._id}).exec();
    next();
});

module.exports = mongoose.model('Forum', Forum);


//post.js

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var User = require('./user.js');
var Forum = require('./forum.js');
var Comment = require('./comment.js');

var Post = new Schema({
    createdBy: {
        type: Schema.Types.ObjectId,
        ref: 'User',
        required: true
    },
    postText: {
        type: String,
        required: true
    },
    forumId: {
        type: Schema.Types.ObjectId,
        ref: 'Forum'
    },
}, {
    timestamps: true
});

Post.pre('remove', function(next) {
    Comment.remove({"postId": this._id}).exec();
    next();
});

module.exports = mongoose.model('Post', Post);


//comment.js [SAME AS INCLUDED ABOVE]
但是在这种情况下,当对论坛实例调用remove时,
forum.pre('remove')…
功能导致抛出错误:TypeError:Post.find不是函数。错误在forum.js第24行(forum.pre(…)块中的第二行)抛出

调用代码如下:

blogRouter.route('/:blogId')

//delete a specific blog by blog id:    [OWNER OR ADMIN USER]
.delete(Verify.verifyOrdinaryUser, Verify.verifyBlogOwnerOrAdmin, function(req, res, next) {
    Blog.findById(req.params.blogId, function(err, blog) {
        if(err) return next(err);
        blog.remove();
        res.json(blog);
    });
});
forumRouter.route('/:forumId')

//delete forum by id:  [ADMIN]
.delete(Verify.verifyOrdinaryUser, Verify.verifyAdmin, function(req, res, next) {
    Forum.findById(req.params.forumId, function(err, forum) {
        if(err) return next(err);
        forum.remove();
        res.json(forum);
    });
});
虽然我在这里和其他地方的在线研究中发现了此错误的实例,但其原因是错误导出的模型或错误定义的架构。Post架构在我代码的其余部分都得到了成功使用,没有任何问题,只是调用Post.find导致了此错误。事实上,我的postRouter代码成功调用以下内容:

postRouter.route('/')

// retrieve all forum posts:  [ALL USERS]
.get(function(req, res, next) {
    Post.find({})
        .populate({
            path: 'forumId',
            model: 'Forum',
            populate: {
                path: 'moderators',
                model: 'User'
            }
        })
        .populate('createdBy')
        .exec(function(err, posts){
            if(err) return next(err);
            res.json(posts);
        });
});

您是否记录了论坛模型中的帖子?是的,当我使用REST API调用基于论坛ID获取所有帖子时,我看到了论坛和帖子之间的正确关联,并且记录了由
Post.find({“forumId”):ObjectId(“这不是我所要求的。您是否做过
console.log(Post)检索的帖子数据?”
就在Post.find未定义的行之前?明白了。刚刚做了,而且似乎Post的行为不正确。当执行console.log(Post)时,我得到了
{}
但是当我在另一个工作示例中执行console.log(Entry)时,我得到了
函数模型(doc,fields,skipId){if(!(此模型实例){返回新模型(doc,fields,skipId);}model.call(this,doc,fields,skipId);}
这仍然不能解决根本问题……在这两种情况下,父子关系都是相同的,模式定义在这两种情况下基本相同,调用代码在这两种情况下都是相同的,但在一种情况下它可以工作,而在另一种情况下它会抛出一个错误。您是否记录了论坛模型中的实际帖子?是的,什么时候我使用REST API调用以获取基于论坛ID的所有帖子,我看到了论坛和帖子之间的正确关联,当我记录通过
Post.find({“forumId”:ObjectId”)检索到的帖子数据时(“这不是我要求的。你做过
console.log(Post)吗?”
就在Post.find未定义的行之前?明白了。刚刚做了,而且似乎Post的行为不正确。当执行console.log(Post)时,我得到了
{}
但是当我在另一个工作示例中执行console.log(Entry)时,我得到了
函数模型(doc,fields,skipId){if(!(此模型实例){返回新模型(doc,fields,skipId);}model.call(this,doc,fields,skipId);}
这仍然不能解决根本问题……在这两种情况下,父子关系都是相同的,模式定义在这两种情况下基本相同,调用代码在这两种情况下都是相同的,但在一种情况下有效,在另一种情况下抛出错误。