【问题标题】:How to perform the query to display the user information after authentication认证后如何查询显示用户信息
【发布时间】:2018-10-29 19:08:27
【问题描述】:

这是我的 index.js

var express = require('express');
var router = express.Router();
var expressValidator = require('express-validator');
var passport = require('passport');
const bcrypt = require('bcrypt');
const saltRounds = 10;
/* GET home page. */
router.get('/', (req, res) => {
  console.log(req.user);
  console.log("This is the value of authentuntication = " +req.isAuthenticated());
  res.render('home', {
    title: 'Home'
  });
});

router.get('/profile/', authenticationMiddleware(),(req,res)=>{
  const db = require('../db.js');
 // var user_id = req.params.id;
  res.render('profile',{title:'Profile'});
  console_log("This is inside get router profile: "+req.user);
});

router.get('/login', (req,res)=>{
  res.render('login',{title:'login'});
});

router.post('/login', passport.authenticate('local', {
  successRedirect:'/profile/',
  failureRedirect:'/login'
}));

router.get('/logout', (req,res)=>{
  req.logout();
  req.session.destroy();
  res.redirect('/');
});

router.get('/register', function (req, res, next) {
  res.render('register', {
    title: 'Registration'
  });
});

router.post('/register', function (req, res, next) {
  //using express validator to validate the data 
  req.checkBody('username', 'Username field cannot be empty.').notEmpty();
  req.checkBody('username', 'Username must be between 4-15 characters long.').len(4, 15);
  req.checkBody('email', 'The email you entered is invalid, please try again.').isEmail();
  req.checkBody('email', 'Email address must be between 4-100 characters long, please try again.').len(4, 100);
  req.checkBody('password', 'Password must be between 8-100 characters long.').len(8, 100);
  req.checkBody("password", "Password must include one lowercase character, one uppercase character, a number, and a special character.").matches(/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!.* )(?=.*[^a-zA-Z0-9]).{8,}$/, "i");
  req.checkBody('passwordMatch', 'Password must be between 8-100 characters long.').len(8, 100);
  req.checkBody('passwordMatch', 'Passwords do not match, please try again.').equals(req.body.password);
  const errors = req.validationErrors();
  if (errors) {
   // console.log(`errors:${JSON.stringify(errors)}`);
    res.render('register', {
      title: 'Registration Error',
      errors: errors
    });
  } else {
    //storing the data comming form post resquest 
    const username = req.body.username;
    const email = req.body.email;
    const password = req.body.password;

    const db = require('../db.js');

    bcrypt.hash(password, saltRounds, function (err, hash) {
      // Store hash in your password DB.
      let sql = "INSERT INTO users(username,email,password) VALUES (?,?,?)";
      db.query(sql, [username, email, hash], (error, result, fields) => {
        if (error) throw error;

        db.query('SELECT LAST_INSERT_ID() as user_id', (error, result, field) => {
          if (error) throw error;

          const user_id = result[0];
         // console.log(result[0]);
          req.login(user_id, (err) => {
            res.redirect("/");
          });
        });

      });
    });
  }
});

passport.serializeUser(function (user_id, done) {
  done(null, user_id);
});

passport.deserializeUser(function (user_id, done) {
  done(null, user_id);
});

function authenticationMiddleware() {
  return (req, res, next) => {
    console.log(`req.session.passport.user: ${JSON.stringify(req.session.passport)}`);
    console.log(`My user id is :  ${JSON.stringify(req.user)}`);

    if (req.isAuthenticated()) return next();
    res.redirect('/login');
  }
}
module.exports = router;

我想获取刚刚登录的用户的 id 并使用该 id 对数据库进行查询并将有关用户的信息提取到 profile.hbs 中。像这样的。

router.get('/profile/', authenticationMiddleware(),(req,res)=>{
  const db = require('../db.js');
 // var user_id = req.params.id;
  res.render('profile',{title:'Profile'});
  console_log("This is inside get router profile: "+req.user);
  /*db.query('SELECT * from users where id = ?', user_id, function(error, results, fields) {
    if (error) {
        console.log("error ocurred while getting user details of " + user_id, error);
        res.send({
            "code": 400,
            "failed": "error ocurred"
        });
    } else {
        res.render("profile",{user:results});
    }
  });*/
});

我可以在 console.log(My user id is : ${JSON.stringify(req.user)});这是在我的 authenticationMiddleware() 函数中,但之后我不知道如何将该 id 传递到加载配置文件的 /profile 路由器。

【问题讨论】:

标签: javascript node.js express passport.js


【解决方案1】:

不确定您的 db.js 包含什么。但理论上,您希望您的代码看起来像(注意 .then func 从 .getUser 返回,这意味着它具有 async/await 模式或以 lehman 语言返回一个承诺) :

const db = require('../db');
router.get('/profile/', authenticationMiddleware(),(req, res, next) => {
   db.getUser(userId).then((userData) => {
      res.render("profile",{user:results});
   }).catch(next)
});

// define an app level error catch
// to produce unified error screens
app.use((err, req, res, next) => {
   res.send({
     "code": 400,
     "failed": "error ocurred"
    });
});

【讨论】:

  • @Ady Levy db.getUser 用于单声道数据库,我使用 mysql 这里是我的 db.js var mysql = require('mysql') var connection = mysql.createConnection({ host: process.env.DB_HOST, user: process.env.DB_USER, password: process.env.DB_PASSWORD, database : process.env.DB_NAME }) connection.connect(); /* connection.query('SELECT 1 + 1 AS solution', function (error, results, fields) { if (error) throw error; console.log('The solution is: ', results[0].solution); });*/ module.exports = connection;
【解决方案2】:

db.getUser 是一个外观方法。可以与任何数据库一起使用,这样应用程序就不会知道它的数据库。

对于 sql,你需要用一个 promise 封装你的查询——比如:

const getUser( userId ) {
    return new Promise( ( resolve, reject ) => {
      const sqlQuery = 'select ....';
      connection.query( sqlQuery, args, ( err, rows ) => {
          if ( err )
              return reject( err );
            resolve( rows );
        } );
    } );
}

【讨论】:

    【解决方案3】:

    在调整了@Ady Levy 的灵魂之后,我想出了这个灵魂,我非常适合我。我是 node 和 express 的新手,所以我不明白用 promise 封装。

    [![router.get('/profile/', authenticationMiddleware(),(req, res, next) => {
      //console.log("router.get/profile/ : "+ req.user.user_id);
      //res.render('profile',{title:'Profile'});
      var userId = req.user.user_id;
      console.log(userId);
      const db = require('../db.js');
      db.query('SELECT * FROM users where id = ?',\[userId\], (err,results,fields)=>{
        if(err) {
          console.log("Error occured while getting the user detail of " + userId, err);
        }
        else{
          res.render('profile',{title:'Profile',user_detail:results\[0\]});
          //console.log(results\[0\]);
        }
    
      });
    });][1]][1]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-11
      • 2019-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-08
      • 2012-08-29
      相关资源
      最近更新 更多