为啥我不能访问猫鼬模式的方法?

Posted

技术标签:

【中文标题】为啥我不能访问猫鼬模式的方法?【英文标题】:Why can't I access a mongoose schema's method?为什么我不能访问猫鼬模式的方法? 【发布时间】:2017-07-07 06:23:21 【问题描述】:

我在 Nodejs 应用程序中有这个 Mongoose 模式:

const mongoose = require('mongoose'),
    Schema = mongoose.Schema,
    sodium = require('sodium').api;

const UserSchema = new Schema(
    username: 
        type: String,
        required: true,
        index:  unique: true 
    ,
    salt: 
        type: String,
        required: false
    ,
    password: 
        type: String,
        required: true
    
);

UserSchema.methods.comparePassword = function(candidatePassword, targetUser) 
    let saltedCandidate = candidatePassword + targetUser.salt;
    if (sodium.crypto_pwhash_str_verify(saltedCandidate, targetUser.password)) 
        return true;
    ;
    return false;
;

module.exports = mongoose.model('User', UserSchema);

我创建了这个路由文件。

const _ = require('lodash');
const User = require('../models/user.js'); // yes, this is the correct location

module.exports = function(app) 
    app.post('/user/isvalid', function(req, res) 
        User.find( username: req.body.username , function(err, user) 
            if (err) 
                res.json( info: 'that user name or password is invalid. Maybe both.' );
            ;
            if (user) 
                if (User.comparePassword(req.body.password, user)) 
                    // user login
                    res.json( info: 'login successful' );
                ;
                // login fail
                res.json( info: 'that user name or password is invalid Maybe both.' );
             else 
                res.json( info: 'that user name or password is invalid. Maybe both.' );
            ;
        );
    );
;

然后我使用 Postman 使用适当的 Body 内容调用 127.0.0.1:3001/user/isvalid。终端说告诉我TypeError: User.comparePassword is not a function 并让应用程序崩溃。

自从if (user) 位通过以来,这表明我已经从 Mongo 正确检索了一个文档并拥有一个 User 模式的实例。为什么方法无效?

eta:我原来复制/粘贴失败的模块导出

【问题讨论】:

添加到用户模型模块的末尾:module.exports = mongoose.model('User', UserSchema); @dNitro 我无法复制/粘贴它,但它在我的实际代码中。接得好。编辑添加它 【参考方案1】:

这会创建实例方法:

UserSchema.methods.comparePassword = function(candidatePassword, targetUser) 
    // ...
;

如果你想要一个静态方法,使用这个:

UserSchema.statics.comparePassword = function(candidatePassword, targetUser) 
    // ...
;

静态方法是当你想调用它为User.comparePassword()

实例方法是当您想将其称为 someUser.comparePassword() 时(在这种情况下,这很有意义,因此您不必显式传递用户实例)。

查看文档:

http://mongoosejs.com/docs/guide.html#methods http://mongoosejs.com/docs/guide.html#statics

【讨论】:

所以鉴于我提供的代码,传入(user) 应该意味着user.comparePassword() 应该可以工作,但它给出了同样的错误。保持原样并在架构定义中使用UserSchema.statics.comparePassword 确实有效,所以我不怀疑它。我想我只是糊涂了。

以上是关于为啥我不能访问猫鼬模式的方法?的主要内容,如果未能解决你的问题,请参考以下文章

JAVA:为啥我不能访问同一个类中的方法?

为啥我不能使用 StoryBoard 从 viewWithTag 方法访问嵌套的 UIView?

为啥我不能从 gcc 中的前身模板化成员函数访问祖先方法?

为啥我不能访问指向数组中成员函数的指针?

为啥我们不能在 C# 中覆盖方法时更改访问修饰符?

为啥枚举的构造函数不能访问静态字段?