Ошибка экспресс-сессии при входе пользователя в Node.JS - PullRequest
0 голосов
/ 15 декабря 2018

Таким образом, в основном в этом коде есть только формы регистрации и входа в систему, и он работал очень хорошо, пока я не добавил к нему сеанс.

Проблема в том, что когда пользователь регистрируется, он регистрируется в информации о зарегистрированном пользователе консоли, это нормально., но когда пользователь возвращается на страницу входа и обновляет страницу, консоль записывает информацию, которая регистрировалась, когда пользователь зарегистрировался, а также сеанс не работает, я на 100% уверен, что это проблема сеанса, но я не могу настроить, что это, здесьэто код (не обращайте внимания на модель «Друзья», это для будущих целей, и я также проверил без этого блока кода, и он работал, так что проблема не существует)

   const http = require('http');
   const express = require('express');
   const socketIO = require('socket.io');
   const bodyParser = require('body-parser');
   const multer = require('multer');
   const consolidate = require('consolidate');
   const session = require('express-session');

  const app = express();
  const server = http.Server(app);
  const io = socketIO(server);
  app.use(session({secret: 'zazagelovidzudzua', resave: false,                               
  saveUninitialized: true}))
  app.engine('html', consolidate.mustache);
  app.set('view engine', 'html');
  app.set('views', __dirname + '/views');

  app.use(bodyParser.json());
  app.use(bodyParser.urlencoded({extended: true}));
  app.use(multer().array());
  app.use(express.static('public'));

  const mongoose = require('mongoose');
  const connectionUri = 'mongodb://localhost/my_database';
  mongoose.Promise = global.Promise;

  mongoose
    .connect(connectionUri, {useNewUrlParser: true})
    .then(() => {
      console.log('Connection to database established');
    })
    .catch(error => {
      console.error('MongoDB connection error:', error.message);
      process.exit(-1);
    });


  const Schema = mongoose.Schema;
  const UserSchema = new Schema({
    username: String,
    password: String,
    email: String,
    friends: [{type: Schema.Types.ObjectId, ref: 'Friends'}]
  });

  const Friend = new Schema({
    name: {type: Schema.Types.ObjectId, ref: 'User'},
    age: Number,
    address: String
  })

  const User = mongoose.model('User', UserSchema);
  const Friends = mongoose.model('Friends', Friend)
    var ses;

  app.get( '/', (req, res) => {
            res.render('mainpage');
    });

  app.get('/reg', (req, res) => {
      res.render('reg');
    });

  app.post(
    '/reeg',
    async (req,res) => {
      try {
  const username = req.body.username
  const password = req.body.password
  const email = req.body.email
  const user = await User.create({username, password, email});
  console.log('Created user:', user);
  res.sendFile(__dirname + '\\views\\mainpage.html')
      }
      catch (error) {
        res.status(500).send(error.message);
      }
    });

  app.post('/login', 
    async (req,res) => {
      ses = req.session

  const {username, password} = req.body;
  const user = await User.findOne({username, password}).select('-            
  password').lean();
        if(!user) {
          res.send('User: ' + username +' not registered');
          return;
        }
        ses.user = user
        res.redirect('/dash')
        return res.status(200);




    });

    app.get('/dash',
    async (req,res) =>{

      try{
        if(!ses.user){
        res.status(401).send('login first please!')
        res.status(200)
        res.send('hi' + ses.user.username)
       }
      }

      catch(error){
  console.log(error.message)
      }


  })



  server.listen('8080');

рис, когда яобновить страницу после регистрации изображение

1 Ответ

0 голосов
/ 15 декабря 2018

Ваша ошибка на

return res.status(200);

ses.user = user

Вы отправляете статус 200 пользователю, но вы также return, что означает, что функция не запускается, и что ses.user = user недоступен (в VS Code эта строкабудет размытым, обнаружит, что он не может быть достигнут).

Мой совет для вас не создавать переменную ses, потому что express-session создаст session в запросе для каждого пользователя, но ses - этоиспользуется общий для вашего сервера Node.JS, что означает, что все пользователи используют только эту переменную ses.Вы должны использовать req.session для каждого запроса.

Ваш код должен быть:

const http = require('http');
const express = require('express');
const socketIO = require('socket.io');
const bodyParser = require('body-parser');
const multer = require('multer');
const consolidate = require('consolidate');
const session = require('express-session');

const app = express();
const server = http.Server(app);
const io = socketIO(server);
app.use(session({
    secret: 'zazagelovidzudzua', resave: false,
    saveUninitialized: true
}))
app.engine('html', consolidate.mustache);
app.set('view engine', 'html');
app.set('views', __dirname + '/views');

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(multer().array());
app.use(express.static('public'));

const mongoose = require('mongoose');
const connectionUri = 'mongodb://localhost/my_database';
mongoose.Promise = global.Promise;

mongoose
    .connect(connectionUri, { useNewUrlParser: true })
    .then(() => {
        console.log('Connection to database established');
    })
    .catch(error => {
        console.error('MongoDB connection error:', error.message);
        process.exit(-1);
    });


const Schema = mongoose.Schema;
const UserSchema = new Schema({
    username: String,
    password: String,
    email: String,
    friends: [{ type: Schema.Types.ObjectId, ref: 'Friends' }]
});

const Friend = new Schema({
    name: { type: Schema.Types.ObjectId, ref: 'User' },
    age: Number,
    address: String
})

const User = mongoose.model('User', UserSchema);
const Friends = mongoose.model('Friends', Friend)
// var ses; // don't create this var

app.get('/', (req, res) => {
    res.render('mainpage');
});

app.get('/reg', (req, res) => {
    res.render('reg');
});

app.post(
    '/reeg',
    async (req, res) => {
        try {
            const username = req.body.username
            const password = req.body.password
            const email = req.body.email
            const user = await User.create({ username, password, email });
            console.log('Created user:', user);
            res.sendFile(__dirname + '/views/mainpage.html')
        }
        catch (error) {
            res.status(500).send(error.message);
        }
    });

app.post('/login',
    async (req, res) => {
        ses = req.session
        try {
            const { username, password } = req.body;
            const user = await User.findOne({ username, password }).select('-password').lean();
            if (!user) {
                res.send('User: ' + username + ' not registered');
                return;
            }
            // ses.user = user
            req.session.user = user; // assign direct data to session for req

            return res.status(200).send('Session ID: ' + req.sessionID);

            // ses.user = user // unreachable statement
        }
        catch (error) {
            res.status(500).send(error.message);
        }
    });

app.get('/dash',
    async (req, res) => {
        // if (!ses.user) {
        if (!req.session.user) {
                res.status(401).send('login first please!')
        }
        res.status(200)
        // res.send('hi' + ses.user.username)
        res.send({
            sessionID: req.sessionID,
            message: 'Hi ' + req.session.user.username
        })
    })


server.listen('8080');
...