Node.js Mongoose Model.find不是一个函数-在一种情况下失败,在另一种情况下起作用
我的数据模型中有两个类似的父子关系树,我正在使用Mongoose的中间件处理级联删除 第一个层次结构表示如下: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.
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);}
这仍然不能解决根本问题……在这两种情况下,父子关系都是相同的,模式定义在这两种情况下基本相同,调用代码在这两种情况下都是相同的,但在一种情况下有效,在另一种情况下抛出错误。