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

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

Рис, когда я обновляю страницу после регистрации image

0
iLiA 15 Дек 2018 в 16:12

1 ответ

Лучший ответ

Ваша ошибка в

return res.status(200);

ses.user = user

Вы отправляете пользователю статус 200, но вы также return, это означает, что функция не запускается, continue, что make 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');
2
huynhsamha 15 Дек 2018 в 13:54