mysql - Nodejs Sequelize 和passport Js,在注册用户时卡在执行查询上

标签 mysql node.js express sequelize.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 还很陌生。

最佳答案

答:经过头脑 Storm 和阅读文档后,这些问题在哪里。

  • 确保 deserializeUser 函数是 await 或 then based,例如

  •     // deserialize user 
        passport.deserializeUser(function (id, done) {
            Auth.findByPk(id).then(function (user) {
                if (user) {
                    done(null, user.get());
                } else {
                    done(user.errors, null);
                }
            });
        });
    
  • 确保您在 route.post 方法中有重定向,例如

  • // route for register action
    app.post('/register',passport.authenticate('local-signup',{ successRedirect: '/',
    failureRedirect: '/register' }),function (req, res) {
    });
    
  • 确保您的所有护照 js 字段都与数据库字段匹配,例如

  • 我有用户名和密码,但在我的数据库中它是用户名和密码。
    像这样改变这些
    const data = {
          userName: username,
          passWord: userPassword,
     };
    
    将所有内容上传到数据库。

    关于mysql - Nodejs Sequelize 和passport Js,在注册用户时卡在执行查询上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64123220/

    相关文章:

    php - 使用PHP在mysql中插入POST数据

    php - 对于 wordpress 插件,哪个是最好的 mysql 或 mysqli 或 $wpdb

    javascript - NodeJS 中 GLOBAL 变量之谜

    php - 使用 mysql_real_escape_string 时添加转义字符

    php - 分配用于 FOR 循环 mysql 查询 php 的数组列表

    node.js - NodeJS req.body 始终为空

    javascript - 为 URL 提供文件

    http - 是否可以在 301、302、303 或 307 重定向上修改或添加自定义 http header ?

    javascript - 使用react登录成功时重定向

    javascript - Node js mysql从选择数据保存到var