Nodejs 中间件 .pre 显示不是函数
Posted
技术标签:
【中文标题】Nodejs 中间件 .pre 显示不是函数【英文标题】:Nodejs middleware .pre shows not a function 【发布时间】:2017-02-05 02:22:32 【问题描述】: var categoryList = new Referral(categoryList : category);
categoryList.pre('save', function (next)
Referral.find(categoryList : category, function (err, docs)
if (!docs.length)
next();
else
console.log('Data exists: ', category);
next(new Error("Data exists!"));
)
)
Referral 是分配给我的架构的变量。 categoryList 是对象
这会报错
TypeError: categoryList.pre 不是函数 D:\Aventyn\ClipCare_v2\app\api.js:112:18 在 Layer.handle [as 处理请求] (D:\Aventyn\ClipCare_v2\node_modules\express\lib\router\layer.js:95:5) 接下来 (D:\Aventyn\ClipCare_v2\node_modules\express\lib\router\route.js:131:13) 在 Route.dispatch (D:\Aventyn\ClipCare_v2\node_modules\express\lib\router\route.js:112:3) 在 Layer.handle [as handle_request] (D:\Aventyn\ClipCare_v2\node_modules\express\lib\router\layer.js:95:5) 在 D:\Aventyn\ClipCare_v2\node_modules\express\lib\router\index.js:277:22 在 Function.process_params (D:\Aventyn\ClipCare_v2\node_modules\express\lib\router\index.js:330:12) 接下来 (D:\Aventyn\ClipCare_v2\node_modules\express\lib\router\index.js:271:10) 在 Function.handle (D:\Aventyn\ClipCare_v2\node_modules\express\lib\router\index.js:176:3) 在路由器 (D:\Aventyn\ClipCare_v2\node_modules\express\lib\router\index.js:46:12) 在 Layer.handle [as handle_request] (D:\Aventyn\ClipCare_v2\node_modules\express\lib\router\layer.js:95:5) 在 trim_prefix (D:\Aventyn\ClipCare_v2\node_modules\express\lib\router\index.js:312:13) 在 D:\Aventyn\ClipCare_v2\node_modules\express\lib\router\index.js:280:7 在 Function.process_params (D:\Aventyn\ClipCare_v2\node_modules\express\lib\router\index.js:330:12) 接下来 (D:\Aventyn\ClipCare_v2\node_modules\express\lib\router\index.js:271:10) 在 D:\Aventyn\ClipCare_v2\node_modules\express\lib\router\index.js:618:15
【问题讨论】:
【参考方案1】:中间件(如 pre
挂钩)是模式的一部分。看起来您正试图在单个文档上使用它,但它不是这样工作的。
相反,在您用于创建 Referral
模型的架构上使用它:
ReferralSchema.pre('save', ...);
这确实意味着 pre 挂钩将应用于该架构的 所有 文档。
【讨论】:
使用 mongoose 将数据从 AngularJS 发布到 mongodb 时,是否可以使用 .pre 来检查 mongodb 中的重复项? @Vignesh 不可靠,不。您可能应该使用unique (sparse) indexes 来确保特定字段的唯一性。【参考方案2】:尝试改变:
categoryList.pre('save', function (next)
// ...
)
到:
categoryList.schema.pre('save', function (next)
// ...
)
.pre()
是 Mongoose 模式的方法,而不是模型。
【讨论】:
当我使用 categoryList.schema.pre('save', function (next) // ... ) 它只是继续加载,并且在服务器控制台中没有显示任何错误。以上是关于Nodejs 中间件 .pre 显示不是函数的主要内容,如果未能解决你的问题,请参考以下文章
Mongoose 是不是提供对 pre('save') 中属性先前值的访问?
passportjs TypeError:User.authenticate 不是函数