TypeError: не удается прочитать свойство «электронная почта» неопределенного в системе аутентификации nodejs

Я пытаюсь запустить модуль аутентификации, используя экспресс-сессию и паспорт.

сервер.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: не удается прочитать свойство «электронная почта» неопределенного

Если бы кто-то мог объяснить, почему это происходит, было бы здорово. Спасибо.


person therealshankman    schedule 27.05.2019    source источник


Ответы (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);
});
person Samarth Juneja    schedule 27.05.2019
comment
req.session находится под express.Router. Должен ли я инициализировать некоторые методы для него, как мы должны для парсера тела? Если нет, то как вы посоветуете проверить мою переменную req.session - person therealshankman; 27.05.2019
comment
Я не определил req. Он просто используется как параметр для функции. - person therealshankman; 27.05.2019
comment
Попробуйте написать первые три строки вне GET-запроса так, как это написано в коде. Он должен работать - person Samarth Juneja; 27.05.2019
comment
Вот что я получаю - ReferenceError: req не определен - person therealshankman; 27.05.2019
comment
Распечатайте объект req.session. Возможно, электронная почта хранится как req.session.user - person Samarth Juneja; 27.05.2019