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 显示不是函数的主要内容,如果未能解决你的问题,请参考以下文章

前端知识体系-NodeJS相关浅谈NodeJS中间件

Mongoose 是不是提供对 pre('save') 中属性先前值的访问?

node js是中间件吗? [关闭]

passportjs TypeError:User.authenticate 不是函数

为啥不调用带有 query: true 的 mongoose 中间件“pre”remove?

Mongo 中间件 pre find 修改query