gpt4 book ai didi

javascript - JS 认为函数未定义,即使它明显存在

转载 作者:太空宇宙 更新时间:2023-11-04 02:22:11 24 4
gpt4 key购买 nike

此问题与 Function is undefined, Bookshelf.js model function is not being recognized as a function 相关

我正在使用Bookshelf.js处理用户注册/登录 API 端点,使用 NodeJS 和 ExpressJS 构建。但是,当 POST 到登录路由时,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)

...

以下是routes/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);
});

以下是models/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);
}
}
});
}
));

这是异步/ promise 问题吗?还是我在其他地方出错了?

最佳答案

看不到是什么在\routes\index.js:217:36,开始尝试回答这个问题非常困难。

编辑:但是,at Strategy.strategy.success 确实表明这是 Promise 未返回的问题。换句话说,你可能正在做类似的事情

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

但实际上并没有在 ThinkingYouAreReturningAPromiseInThisFunction() 中返回 Promise 对象。换句话说,success() 不是一个函数。一般来说,Promise 对象会有一个类似 success() 的方法。但如果没有返回这样的对象,则 undefined 不是一个函数。我将从那里开始排除故障。

关于javascript - JS 认为函数未定义,即使它明显存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32706683/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com