繁体   English   中英

TypeError:SomeFunction不是函数(使用Mongoose)

[英]TypeError: SomeFunction is not a function (using Mongoose)

我遇到此错误:TypeError:User.getUserByUsername不是Strategy._verify的函数(... / routes / users.js:65:10)

var User = require('../models/user');

passport.use(new LocalStrategy(
  function(username, password, done) {
    User.getUserByUsername(username, function(err,user){
    if(err) throw err;
    if (!user){
        return done(null, false, {message: 'Unknow User'});
    }

    User.comparePassword(password, user.password, function(err, isMatch){
        if(err) throw err;
        if(isMatch){
            return done(null,user);
        } else {
                return done(null, false, {message: "Invalid password"});
        }
    });
   });
  }));

该函数在models / user.js中定义

module.exports.getUserByUsername = function(username, callback){
var query = {username: username};
User.findOne(query, callback);
 }

检查../models/user模块要导出什么。 从对问题的描述中,它可以导出某些内容,但是该内容不具有getUserByUsername函数-该模块可能导出的是原型或类,您应该实例化,例如:

var UserModel = require('../models/user');
var user = new UserModel();
...

从外观上看,您正在使用猫鼬(总是在您的问题中提到)。 如果不是,请忽略以下内容(但请更新您的问题以表示您正在使用哪个ORM)。

我认为您可能在models/user.js这样做:

module.exports.getUserByUsername = function(...) {}
...
module.exports = mongoose.model('User', ...);

后面的分配将替换module.exports ,因此使getUserByUsername无法访问。

相反,最好将getUserByUsername 静态方法 ,就像comparePassword一样:

userSchema.statics.getUserByUsername = function(...) {}

请尝试以下操作,如下更改您的User.js文件:

exports.getUserByUsername = function(username, callback){
  var query = {username: username};
  User.findOne(query, callback);
};

可能是您分配给module.exports稍后在文件下module.exports吗? 分配给module.exportsexports后,应声明导出成员

例如

    module.exports.getUserByUsername = function() {...};

    module.exports = User;

会是与您类似的常见问题。

问题是由于错误地声明了流程流的功能之一。 为了正确导出所有对象,必须以相同的方式声明所有函数。

module.exports.getUserByUsername = function()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM