Ошибка с экспресс-сеансом при входе пользователя в Node.JS

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

Проблема в том, что когда пользователь регистрируется, он регистрирует в консоли информацию о зарегистрированном пользователе, все в порядке, но когда пользователь возвращается на страницу входа и обновляет страницу, консоль регистрирует информацию, которая регистрируется при регистрации пользователя, а также сеанс не работает, мне 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');

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


person iLiA    schedule 15.12.2018    source источник
comment
вы можете проверить соединение и события с помощью клиента GUI firecamp.app   -  person Nishchit    schedule 18.12.2018
comment
я не использую графический интерфейс, но позже я думаю, что буду использовать mlab   -  person iLiA    schedule 19.12.2018
comment
FC — это клиент с графическим интерфейсом для SocketIO и WS.   -  person Nishchit    schedule 20.12.2018
comment
о, я думал, ты имел в виду Мангуста, хорошо, спасибо за совет   -  person iLiA    schedule 21.12.2018


Ответы (1)


Ваша ошибка в

return res.status(200);

ses.user = user

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

Мой совет для вас: не создавайте переменную ses, потому что express-session создаст session в req для каждого пользователя, а 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');
person huynhsamha    schedule 15.12.2018
comment
пожалуйста, проверьте код еще раз, я его отредактировал, но когда я попробовал старый код, он все еще регистрируется снова, также когда я пробовал этот отредактированный код (мой код), он только показал, что не может получить тире, поэтому позвольте мне попробовать ваш код, и я скажу вам, если это работает - person iLiA; 15.12.2018
comment
он показывает мне идентификатор сеанса: 4q7bKy3DoonVcptAzzpidQkpNpmbKtD0, но в маршруте «вход в систему», а не в маршруте «тире» - person iLiA; 15.12.2018
comment
{sessionID: SlUS_q4CQyeWLbPgyOeuNKo0W5M_ytxC, сообщение: Привет, Джордж} - person iLiA; 15.12.2018
comment
о, я не обратил внимание на res.send() извините - person iLiA; 15.12.2018
comment
он показывает мне эту ошибку после того, как я вхожу в систему, но все равно входит в систему (узел: 4900) UnhandledPromiseRejectionWarning: отклонение необработанного обещания. Эта ошибка возникла либо из-за броска внутри асинхронной функции без блока catch, либо из-за отклонения обещания, которое не было обработано с помощью .catch(). (идентификатор отклонения: 1) (узел: 4900) [DEP0018] Предупреждение об устаревании: отклонение необработанных обещаний считается устаревшим. В будущем отказы от обещаний, которые не будут обработаны, завершат процесс Node.js с ненулевым кодом выхода. - person iLiA; 15.12.2018
comment
и (узел: 4900) UnhandledPromiseRejectionWarning: Ошибка: невозможно установить заголовки после отправки y. в validateHeader (_http_outgoing.js:491:11) в ServerResponse.setHeader (_http_outgoing.js:498:3) в ServerResponse.header (C:\Users\tuna\Desktop\Xga\node_modules\express\lib \response.js: 767:10) в ServerResponse.send (C:\Users\tuna\Desktop\Xga\node_modules\express\lib\r esponse.js:170:12) в app.post (C:\Users\tuna\Desktop\Xga \proj.js:100:29) в ‹анонимном› - person iLiA; 15.12.2018
comment
@codR, хорошо :), спасибо за ваши усилия с моим решением - person huynhsamha; 16.12.2018