Node.js 创建用户时Passport本地超时(节点、Express、Postgres、Knex)
我有一个Node/Express API向Vue前端提供数据,现在正在添加用于身份验证和授权的Passport。我有一个createUser函数,它成功地添加了用户,但在执行此操作时该函数挂起。我确信这只是我错过的一件愚蠢的事情,比如不调用Node.js 创建用户时Passport本地超时(节点、Express、Postgres、Knex),node.js,express,passport.js,knex.js,passport-local,Node.js,Express,Passport.js,Knex.js,Passport Local,我有一个Node/Express API向Vue前端提供数据,现在正在添加用于身份验证和授权的Passport。我有一个createUser函数,它成功地添加了用户,但在执行此操作时该函数挂起。我确信这只是我错过的一件愚蠢的事情,比如不调用next()(尽管我这样做了),我希望有人能有一个清晰的头脑来看看 //authrouts.js const router = require('express').Router(); const { createUser } = require('../co
next()
(尽管我这样做了),我希望有人能有一个清晰的头脑来看看
//authrouts.js
const router = require('express').Router();
const { createUser } = require('../controllers/authController');
router.route('/auth/register').post(createUser);
module.exports = router;
//authController.js
'use strict';
const authHelpers = require('../auth/_helpers');
const passport = require('../auth/local');
const handleResponse = (res, code, statusMsg) => {
res.status(code).json({ status: statusMsg });
};
const createUser = (req, res, next) => {
// passes correct user and pass
console.log(req.body);
return authHelpers
.createUser(req, res, next)
.then(() => {
passport.authenticate('local', (err, user, info) => {
if (err) {
handleResponse(res, 500, 'error');
console.log(info);
}
if (user) {
handleResponse(res, 200, 'success');
console.log(info);
}
})(req, res, next);
})
.catch(next);
};
module.exports = {
createUser,
};
//auth/_helpers.js
const bcrypt = require('bcryptjs');
const knex = require('../db/connection');
const comparePass = (userPassword, databasePassword) =>
bcrypt.compareSync(userPassword, databasePassword);
const createUser = req => {
const salt = bcrypt.genSaltSync();
const hash = bcrypt.hashSync(req.body.password, salt);
return knex('users')
.insert({
email: req.body.email,
password: hash,
})
.returning('*');
};
module.exports = {
comparePass,
createUser,
};
编辑1:
根据@cantuket的建议,记录createUser返回的内容将生成用户对象,该对象将正确插入数据库:
//console.log('res:',result)
const createUser=(请求、恢复、下一步)=>{
返回作者助手
.createUser(请求、恢复)
。然后(响应=>{
passport.authenticate('本地',(错误、用户、信息)=>{
如果(错误){
控制台错误(err);
控制台信息(info);
HandlerResponse(res,500,“错误”);
返回下一个(错误);
}
如果(!响应){
控制台错误(err);
控制台信息(info);
HandlerResponse(res,500,“无用户”);
返回下一个(错误);
}
如果(答复){
HandlerResponse(res,200,“成功”);
next();
}
})(req、res、next);
})
.catch(错误=>{
控制台错误(err);
控制台信息(info);
HandlerResponse(res,500,“错误”);
返回下一个(错误);
});
};
不是答案: 我要做的第一件事是检查
createUser()->knex().insert()
返回的内容
.then(result => {
console.log('createUser:', result)
passport.authenticate('local', (err, user, info) => {
if (err) {
handleResponse(res, 500, 'error');
console.log(info);
}
if (user) {
handleResponse(res, 200, 'success');
console.log(info);
}
})(req, res, next);
})
.catch(err=> {
console.log('err createUser:', err)
next();
});
我可以看到您正在验证passport,而不是注册用户。确保在主条目文件app.js中使用passport,如下所示
const passport = require('passport')
app.use(passport.initialize())
app.use(passport.session())
passport.use(User.createStrategy())
passport.serializeUser((user, done)=>done(null, user.id));
passport.deserializeUser((id, done)=>User.findById(id, (err, user)=>done(err, user)))
app.use((req, res, next)=>{
res.locals.currentUser = req.user;
res.locals.title = 'Conforti';
res.locals.success = req.session.success || '';
delete req.session.success;
res.locals.error = req.session.error || '';
delete req.session.error;
res.locals.csrfToken= req.csrfToken();
req.session.cookie.expires = new Date(Date.now() + 3600000)
req.session.cookie.maxAge = 3600000
next();
});
在控制器中,您应该导入用户模型并对其进行身份验证,如下所示:
const User = require('../models/users')
这是postLogin函数:
postLogin: async (req, res, next)=>{
const {username, password} = req.body;
const {user, error} = await User.authenticate()(username, password);
if(!user && error) return next(error);
req.login(user, (err)=>{
if(err) return next(err);
req.session.success = `Welcome back, ${user.username}`;
const redirectUrl = req.session.redirectTo || '/';
delete req.session.redirectTo;
res.redirect(redirectUrl);
});
},
这可能不是全部代码,但它可能有助于您发现错误
您还可以在npmjs.com上查看passport文档,因此这两个文档都没有被称为
console.log(info)代码>?此外,您可能需要将它们移动到handleResponse()
上方,以防在console.log()之前完成
const User = require('../models/users')
postLogin: async (req, res, next)=>{
const {username, password} = req.body;
const {user, error} = await User.authenticate()(username, password);
if(!user && error) return next(error);
req.login(user, (err)=>{
if(err) return next(err);
req.session.success = `Welcome back, ${user.username}`;
const redirectUrl = req.session.redirectTo || '/';
delete req.session.redirectTo;
res.redirect(redirectUrl);
});
},