首页 > 解决方案 > Nodejs Sequelize和Passport Js,注册用户时卡在执行查询

问题描述

这是我遇到的问题:

我有 3 个模型(用户、收藏夹、加密货币)

'use strict';
const { Model} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
  class Cryptocoin extends Model {
    /**
     * Helper method for defining associations.
     * This method is not a part of Sequelize lifecycle.
     * The `models/index` file will call this method automatically.
     */
    static associate(models) {
      // define association here
    }
  }
  Cryptocoin.init({
    coinId:{
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: DataTypes.INTEGER
    },
    coinName: DataTypes.STRING,
    coinPrice: DataTypes.INTEGER,
    coinAmount: DataTypes.INTEGER,
    totalValue: DataTypes.STRING,
    boughtOn: DataTypes.DATE
  }, {
    sequelize,
    modelName: 'Cryptocoin',
  });
  return Cryptocoin;
};
'use strict';
const { Model } = require('sequelize');
module.exports = (sequelize, DataTypes) => {
  class Favorite extends Model {
    /**
     * Helper method for defining associations.
     * This method is not a part of Sequelize lifecycle.
     * The `models/index` file will call this method automatically.
     */
    static associate(models) {
      // define association here
    }
  }
  Favorite.init({
    favoriteId: {
        type:DataTypes.INTEGER,
        primaryKey:true,
        autoIncrement:true,
    },
    userId:{
        type:DataTypes.INTEGER,
        references:{
            model:'Users',
            key:'userId',
        },
        onDelete:'CASCADE',
    },
    coinId:{
        type:DataTypes.INTEGER,
        references:{
            model:'Cryptocoins',
            key:'coinId',
        },
        onDelete:'CASCADE',
    },
  }, {
    sequelize,
    modelName: 'Favorite',
  });
  return Favorite;
};
'use strict';
const { Model} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
  class User extends Model {
    /**
     * Helper method for defining associations.
     * This method is not a part of Sequelize lifecycle.
     * The `models/index` file will call this method automatically.
     */
    static associate(models) {
        
    }
  }
  User.init({
    userId: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: DataTypes.INTEGER
      },
    userName: DataTypes.STRING,
    passWord: DataTypes.STRING
  }, {
    sequelize,
    modelName: 'User',
  });
  return User;
};

这些都有有效的迁移。

现在我有一个包含护照状态的 passport.js 文件

const bcrypt = require('bcrypt');

module.exports = function (passport, Auth) {

    const LocalStrategy = require('passport-local').Strategy;

    passport.use('local-signup', new LocalStrategy(
        
        {
            usernameField: 'username',
            passwordField: 'password',
            passReqToCallback: true // allows us to pass back the entire request to the callback

        }, function (req, username, password, done) {
            console.log("Signup for - ", username)
            const generateHash = function (password) {
                return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
            }
            Auth.findOne({
                where: {
                    userName: username
                }
            }).then(function (user) {
                //console.log(user);
                if (user) {
                    return done(null, false, {
                        message: 'That username is already taken'
                    });
                } else {
                    const userPassword = generateHash(password);
                    const data = {
                        username: username,
                        password: userPassword,
                    };

                    Auth.create(data).then(function (newUser, created) {
                        if (!newUser)return done(null, false);
                        if (newUser) return done(null, newUser)
                    });
                    }
            });
        }
    ));

app.js像这样调用这个文件

只是 app.js 中的代码片段

const models = require('./models');

app.use(session({
    genid: (req) => {
        return uuid.v1();
    },
    name: 'Crypto-session',
    store:new fileStore(),
    secret: '------',
    resave:false,
    saveUninitialized:false,
}))
app.use(passport.initialize());
app.use(passport.session());

require('./config/passport')(passport,models.User);

现在,当转到我的 /register 路线并输入用户名和密码时,会发生这种情况

Signup for -  randomUser
Executing (default): SELECT `userId`, `userName`, `passWord`, `createdAt`, `updatedAt` FROM `Users` AS `User` WHERE `User`.`userName` = 'randomUser' LIMIT 1;
Executing (default): INSERT INTO `Users` (`userId`,`createdAt`,`updatedAt`) VALUES (DEFAULT,?,?);

它停留在执行(默认)部分,它被上传到数据库但没有任何用户名或密码,控制台日志显示它们都被我的表单中的值填充。

知道如何解决这个问题吗?

注意:一般来说,我对表达和 nodeJs 相当陌生。

标签: mysqlnode.jsexpresssequelize.js

解决方案


答:在头脑风暴和阅读文档之后,这些问题在哪里。

  1. 确保 deserializeUser 函数是 await 或 then 基于,例如
    // deserialize user 
    passport.deserializeUser(function (id, done) {
        Auth.findByPk(id).then(function (user) {
            if (user) {
                done(null, user.get());
            } else {
                done(user.errors, null);
            }
        });
    });
  1. 确保您在 route.post 方法中有重定向,例如
// route for register action
app.post('/register',passport.authenticate('local-signup',{ successRedirect: '/',
failureRedirect: '/register' }),function (req, res) {
});
  1. 确保您的所有护照 js 字段与数据库字段匹配,例如

我有用户名和密码,但在我的数据库中是用户名和密码。

像这样改变这些

const data = {
      userName: username,
      passWord: userPassword,
 };

将所有内容上传到数据库。


推荐阅读