Node.js 创建用户时Passport本地超时(节点、Express、Postgres、Knex)

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

我有一个Node/Express API向Vue前端提供数据,现在正在添加用于身份验证和授权的Passport。我有一个createUser函数,它成功地添加了用户,但在执行此操作时该函数挂起。我确信这只是我错过的一件愚蠢的事情,比如不调用
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);
    
   });
  },