javascript - Node.js 同步调用护照本地注册

标签 javascript mysql node.js

我一直在尝试与 Node.js 相处,并且正在努力学习一些核心内容。我的问题出在护照上,我不知道如何进行同步调用。我想要的是:如果已经有注册电子邮件的用户,我不想创建它,我会抛出一条闪信,否则我会创建用户。我不确定如何在检查电子邮件唯一性后才创建用户。我在 if 语句中尝试使用 return true/false,但它似乎不正确。

我从 scotch.io 的护照教程中改编了我的代码。

// passport.js
// load all the things we need
var LocalStrategy   = require('passport-local').Strategy;

// load up the user model
var User            = require('../app/models/user');

// expose this function to our app using module.exports
module.exports = function(passport) {

// =========================================================================
// passport session setup ==================================================
// =========================================================================
// required for persistent login sessions
// passport needs ability to serialize and unserialize users out of session

// used to serialize the user for the session
passport.serializeUser(function(user, done) {
    done(null, user.id);
});

// used to deserialize the user
passport.deserializeUser(function(id, done) {
    User.findById(id, function(err, user) {
        done(err, user);
    });
});

// =========================================================================
// LOCAL SIGNUP ============================================================
// =========================================================================
// we are using named strategies since we have one for login and one for signup
// by default, if there was no name, it would just be called 'local'

passport.use('local-signup', new LocalStrategy({
    // by default, local strategy uses username and password, we will override with email
    usernameField : 'email',
    passwordField : 'password',
    passReqToCallback : true // allows us to pass back the entire request to the callback
},
function(req, email, password, done) {

    // find a user whose email is the same as the forms email
    // we are checking to see if the user trying to login already exists
    if(!User.isEmailInUse(req)){

        var newUser = {};

        //create the user
        User.createUser(req, newUser), 
        function (){

            console.log('function ception ' + newUser)

            if(newUser){
                return done(null, newUser, req.flash('signupMessage', 'Great success!'));
            }else{
                return done(null, false, req.flash('signupMessage', 'An error has occurred.'));
            }
        };

        console.log('what now?');

    }else{

        return done(null, false, req.flash('signupMessage', 'That email is already taken.'));

    }

}));

};



// user.js
var mysql = require('../../config/database.js').mysql;
var bcrypt = require('bcrypt-nodejs');

// Create user.
module.exports.createUser = function(req, res){

var input = JSON.parse(JSON.stringify(req.body));

var salt = bcrypt.genSaltSync(10); 

var currentdate = new Date(); 
var datetime = currentdate.getFullYear() + "/"  
                + (currentdate.getMonth()+1)  + "/" 
                + currentdate.getDate() + " "
                + currentdate.getHours() + ":"  
                + currentdate.getMinutes() + ":" 
                + currentdate.getSeconds();

// create the user
var newUserMysql = {
    email: input.email,
    password: bcrypt.hashSync(input.password, salt, null),  // use the generateHash function in our user model
    isActive: 1,
    createdAt: datetime
};

var insertQuery = "INSERT INTO tUsers ( usrEmail, usrPassword, usrIsActive, usrCreatedAt ) values (?,?, ?, ?)";

console.log('about to run insert into');

mysql.query(insertQuery,[newUserMysql.email, newUserMysql.password, newUserMysql.isActive, newUserMysql.createdAt],function(err, rows) {

    if(!err){
        newUserMysql.id = rows.insertId;
        console.log('returning user');

        res = newUserMysql;
    }else{

        console.log(err);

        res = null;
    }

});
};

module.exports.isEmailInUse = function(req){

var input = JSON.parse(JSON.stringify(req.body));

var selectQuery = "SELECT * FROM tUsers WHERE usrEmail = ?";

var query = mysql.query(selectQuery, [input.email], function(err, rows, fields) {
    console.log(query.sql);

  if (!err){
    if(rows > 0){
        return true;
    }
    console.log('The solution is: ', rows);

    return false;
  }
  else
  {
    console.log('Error while performing Query -> ' + err);

    return false;
  }


});

};

最佳答案

您需要在函数isEmailInUse 中返回一个回调。 在这个函数中,您正在调用正在运行对数据库的异步调用的 mysql.query。

将函数 isEmailInUser 更改为:

module.exports.isEmailInUse = function(req, callback){
    var input = JSON.parse(JSON.stringify(req.body));
    var selectQuery = "SELECT * FROM tUsers WHERE usrEmail = ?";

    var query = mysql.query(selectQuery, [input.email], function(err, rows, fields) {
        console.log(query.sql);
        if (!err){
            if(rows > 0){
                return callback(null, true);
            }
            console.log('The solution is: ', rows);
            return callback(null, false);
        }
        else {
            console.log('Error while performing Query -> ' + err);
            return callback(err, false);
        }
    });
};

并使用它:

IsEmailInUser(req, function(err, inUse){
    if(isUse){
        //create code
    }
    else {
        //send error to user
    }
});

关于javascript - Node.js 同步调用护照本地注册,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28814619/

相关文章:

node.js - Heroku 找不到模块 'Sequelize'

javascript - 在 javascript 中使用闭包时出现类型错误

javascript - 引号和双引号的条件正则表达式

javascript - 从数据获取时外部 href 未打开

php - 我安装了 Apache 并向其中添加了 PHP,而不是安装了 MySql,但 PHPMYADMIN 无法正常工作?

node.js - Nodejs 进程 CLI 变量包含对象

node.js - 在 axios 中禁用 SSL 认证验证

javascript - 如何在 Handlebars 模板属性中使用变量

javascript - 在同一个对象上调用多个方法时如何不重复 "obj."?

java - 添加到表后读取数据返回零