【问题标题】:"TypeError: Cannot read property 'email' of undefined" in nodejs authentication systemnodejs身份验证系统中的“TypeError:无法读取未定义的属性'电子邮件'”
【发布时间】:2019-05-27 06:39:38
【问题描述】:

我正在尝试使用快速会话和护照运行身份验证模块。

server.js

var express = require("express");
var session = require('express-session'); 
var connection = require('./config');
var bodyParser = require('body-parser');
var passport = require('passport');
const redis = require('redis');
const redisStore = require('connect-redis')(session);
const client  = redis.createClient();
var app = express();
var router = express.Router();
var authController=require('./controllers/auth-controller');
var regController=require('./controllers/reg-controller');

app.use(session({secret: 'secret', store: new redisStore({ host: 'localhost', port: 8000, client: client,ttl : 260}), saveUninitialized: true, resave: true}));
app.use(passport.initialize());
app.use(passport.session());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

router.get('/',(req,res) => {
    let sess = req.session;
    if(sess.email){
        return res.redirect('/admin');
    }
    res.sendFile( __dirname + '/' + 'index.html' );
})

router.post('/login',(req,res) => {
    sess = req.session;
    sess.email = req.body.email;
    res.end('done');
});

router.get('/admin',(req,res) => {
    sess = req.session;
    if(sess.email) {
        res.write(`<h1>Hello ${sess.email} </h1><br>`);
        res.end('<a href='+'/logout'+'>Logout</a>');
    }
    else {
        res.write('<h1>Please login first.</h1>');
        res.end('<a href='+'/'+'>Login</a>');
    }
});

router.get('/logout',(req,res) => {
    req.session.destroy((err) => {
        if(err) {
            return console.log(err);
        }
        res.redirect('/');
    });

});

app.use('/', router);

app.post('/api/register',regController.register);
app.post('/api/authenticate',authController.authenticate);

console.log(authController);
app.post('/controllers/register-controller', regController.register);
app.post('/controllers/authenticate-controller', authController.authenticate);
app.listen(8000);

config.js

var mysql      = require('mysql');
const localAuth = require('./controllers/timeoutcontroller');
var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'root',
  password : 'password',
  database : 'dbname'
});
connection.connect(function(err){
if(!err) {
    console.log("Database is connected");
} else {
    console.log("Error while connecting with database");
}
});

function ensureAuthenticated(req, res, next) {
  if (!(req.headers && req.headers.authorization)) {
    return res.status(400).json({
      status: 'Please log in'
    });
  }
  // decode the token
  var header = req.headers.authorization.split(' ');
  var token = header[1];
  localAuth.decodeToken(token, (err, payload) => {
    if (err) {
      return res.status(401).json({
        status: 'Token has expired'
      });
    } else {
      return knex('users').where({id: parseInt(payload.sub)}).first()
      .then((user) => {
        next();
      })
      .catch((err) => {
        res.status(500).json({
          status: 'error'
        });
      });
    }
  });
}

module.exports = connection; 

在这里我可以连接到 mysql 数据库并且连接已设置,但我收到错误

TypeError: 无法读取未定义的属性“电子邮件”

如果有人能解释为什么会发生这种情况,那就太好了。 谢谢。

【问题讨论】:

    标签: node.js express passport.js node-redis


    【解决方案1】:

    这意味着您的变量 sess 未定义。您的 req.session 变量内部没有任何值。您需要检查为什么会发生这种情况。

    试试这个:

    let sess = req.session;
    sess.user = req.user;
    req.mysess=sess.user //pass like this
    
    
    router.get('/', function(req, res, next) {
        let sess = req.mysess;
        console.log(sess);
    });
    

    【讨论】:

    • req.session 在 express.Router 下。我是否必须为它初始化一些方法,就像我们必须为正文解析器一样?如果没有,那么您如何建议我检查我的 req.session 变量
    • 我没有定义req。它只是用作函数的参数。
    • 尝试在 GET 请求之外编写前三行,就像在代码中编写的那样。它应该工作
    • 这就是我得到的 - ReferenceError: req is not defined
    • 打印req.session 对象。也许电子邮件存储为 req.session.user
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    • 2021-07-21
    • 2019-04-29
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多