2015-09-22 4 views
1

Этот вопрос связан с Function is undefined, Bookshelf.js model function is not being recognized as a functionJS думает функция не определена, хотя она явно существует

Я использую Bookshelf.js для обработки пользовательского реестра/входа в API-конечные точки, построенные с NodeJS и ExpressJS. Однако, при проводке на маршрут входа, Bookshelf выдает следующее сообщение об ошибке:

Unhandled rejection TypeError: undefined is not a function 
    at \routes\index.js:217:36 
    at Strategy.strategy.success (\node_modules\passport\lib\middleware\authenticate.js:194:18) 
    at verified (\node_modules\passport-local\lib\strategy.js:83:10) 
    at null.<anonymous> (\config\passport.js:17:20) 

... 

Следующая является маршруты/index.js

var User = require('./models/User'); 
router.post('/login', function(req, res, next){ 
    if(!req.body.username || !req.body.password){ 
    return res.status(400).json({message: 'Please fill out all fields'}); 
    } 
    passport.authenticate('local', function(err, user, info){ 
    if(err){ return next(err); } 
    if(user){ 
     return res.json({token: user.generateJWT()}); 
    } else { 
     return res.status(401).json(info); 
    } 
    })(req, res, next); 
}); 

Ниже модели/Users.js

var jwt = require('jsonwebtoken'); 
var bcrypt = require('bcrypt'); 
var bookshelf = require('../config/bookshelf'); 

var User = bookshelf.Model.extend({ 
    tableName: 'users', 
    validPassword: function(password, encryptedPass) { 
    return new Promise(function (resolve, reject) { 
     bcrypt.compare(password, encryptedPass, function (err, match) { 
     if(err) return reject(err); 
     resolve(match); 
     }); 
    }); 
    }, 
    generateJWT: function() { 
    // set expiration to 60 days 
    var today = new Date(); 
    var exp = new Date(today); 
    exp.setDate(today.getDate() + 60); 

    return jwt.sign({ 
     _id: this._id, 
     email: this.email, 
     exp: parseInt(exp.getTime()/1000), 
    }, 'SECRET'); 
    } 
}, { 
    createPassword: function (password) { 
    return new Promise(function (resolve, reject) { 
     bcrypt.genSalt(10, function (err, salt) { 
     if (err) return reject(err); 
     bcrypt.hash(password, salt, function (err, hash) { 
      if (err) return reject(err); 
      resolve(hash); 
     }); 
     }); 
    }); 
    } 
}); 

module.exports = User; 

и здесь config/passport.js

var passport = require('passport'); 
var LocalStrategy = require('passport-local').Strategy; 
var User = require('../models/Users'); 

passport.use(new LocalStrategy(
    function(email, password, done) { 
    new User({email: email}).fetch().then(function(data) { 
     var user = data; 
     var curr_user = this; 
     if(user === null) { 
     return done(null, false, {message: 'Invalid username or password'}); 
     } else { 
     user = data.toJSON(); 
     if (!curr_user.validPassword(password)) { 
      return done(null, false, {message: 'Invalid username or password'}); 
     } else { 
      return done(null, user); 
     } 
     } 
    }); 
    } 
)); 

Является ли это проблемой асинхронного/обещания? Или я ошибся где-то в другом месте?

+0

Итак, проблема в том, что 'generateJWT' не существует? Или что? Является ли значение 'user' тем, что вы ожидаете? –

+0

@tyler Последнее, что я проверил, JSFiddle и другие не делают Node.js – SomeKittens

+0

JS не «думает». Если он говорит, что он не существует в вызывающем контексте, он не существует в вызывающем контексте. Вы помните, что учитывали это? Поскольку это хорошая ставка, эти обратные вызовы не поддерживают контекст вызова. Что находится на '\ routes \ index.js: 217: 36'? –

ответ

0

Не видя, что такое at \routes\index.js:217:36, очень трудно начать пытаться ответить на этот вопрос.

Редактировать: Однако at Strategy.strategy.success действительно предполагает, что это проблема с возвратом обещания. Другими словами, вы, вероятно, делать что-то вроде

ThinkingYouAreReturningAPromiseInThisFunction 
    .success(function(result) { 
    // stuff 
    }); 

, но на самом деле не возвращающей объект Promise в ThinkingYouAreReturningAPromiseInThisFunction(). Другими словами, success() не является функцией. Как правило, объект Promise имеет такой метод, как success(). Но если такой объект не возвращается, то undefined is not a function. Я бы начал поиск неисправностей там.