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

时间:2016-07-02 05:44:35

标签: javascript node.js 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);
 }

5 个答案:

答案 0 :(得分:0)

检查../models/user模块正在导出的内容。根据您对问题的描述,它导出一些东西,但是某些东西没有getUserByUsername函数 - 该模块可能是导出原型或类,您应该实例化,例如:

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

答案 1 :(得分:0)

从它的外观来看,你使用的是Mongoose(在你的问题中总是很好)。如果没有,请忽略以下内容(但请更新您的问题以表明您正在使用的ORM)。

我认为您可能会在models/user.js中执行此操作:

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

后一个作业将取代module.exports,因此getUserByUsername无法访问。

相反,最好让getUserByUsername成为static method,就像comparePassword一样:

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

是否可以在以后向文件中分配module.exports?应在分配到module.exportsexports

后声明导出成员

E.g。

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

    module.exports = User;

将是一个类似于你的常见问题。

答案 4 :(得分:0)

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

module.exports.getUserByUsername = function()