【问题标题】:Passport-local times out on create user (Node, Express, Postgres, Knex)Passport-local 在创建用户时超时(Node、Express、Postgres、Knex)
【发布时间】:2019-07-23 19:20:02
【问题描述】:

我有一个 Node/Express API 为 Vue 前端提供数据,现在我正在添加 Passport 以进行身份​​验证和授权。我有一个 createUser 函数,它成功添加了用户,但是这样做时函数挂起。我确定这只是我错过的一件愚蠢的事情,比如不打电话给next()(虽然我这样做了),我会很感激有头脑更清晰的人看看。

//authRoutes.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: ', 结果)

{ id: 30,
    email: 'boooya@dubay.com',
    password:
     '$2a$10$WNX.9ur7PlS9ZZvZlJk9Tu9j3lWMjaTlUQ1v7i84dqgHscDupIowW',
    admin: false,
    created_at: 2019-03-01T18:22:53.120Z,
    updated_at: 2019-03-01T18:22:53.120Z,
    last_login: null } 
    ```

EDIT 2:
Thanks to [@cantuket][1] for reminding me to get dirty with console logs, I figured it out by switching 'user' with the returned value (here response), and returning nexts. See below for the fix that worked:

const createUser = (req, res, next) => { 返回 authHelpers .createUser(req, res) .then(响应 => { passport.authenticate('local', (err, user, info) => { 如果(错误){ 控制台.错误(错误); 控制台信息(信息); handleResponse(res, 500, '错误'); 返回下一个(错误); } 如果(!响应){ 控制台.错误(错误); 控制台信息(信息); handleResponse(res, 500, '没有用户'); 返回下一个(错误); } 如果(响应){ handleResponse(res, 200, '成功'); 下一个(); } })(req, res, next); }) .catch(错误 => { 控制台.错误(错误); 控制台信息(信息); handleResponse(res, 500, '错误'); 返回下一个(错误); }); };



  [1]: https://meta.stackexchange.com/users/461693/cantuket

【问题讨论】:

    标签: node.js express passport.js knex.js passport-local


    【解决方案1】:

    我可以看到您正在验证护照而不是注册用户。确保在你的主入口文件 app.js 中使用护照,像这样。

        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 上查看护照文件

    【讨论】:

      【解决方案2】:

      不是答案:

      我要做的第一件事是检查 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();
          });
      

      【讨论】:

      • 所以这些都不叫console.log(info); 吗?此外,您可能希望将它们移到handleResponse() 上方,以防在console.log() 之前完成
      猜你喜欢
      • 2021-12-21
      • 2017-01-26
      • 2019-12-05
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-14
      • 1970-01-01
      相关资源
      最近更新 更多