Использование экспресс-сессии для входа в систему, но при настройке свойств req.session они не сохраняются - PullRequest
0 голосов
/ 25 октября 2018

Мое приложение включает в себя вход в систему и регистрацию пользователей.При правильном входе в систему я устанавливаю для 'req.session.authentication' значение 'true' среди других свойств, которыми обладает пользователь, а затем сервер отправляет обратно токен доступа (который работает нормально).После этого веб-интерфейс сделает запрос GET для пользователя, который вошел в систему, но когда этот запрос поступает, ни одно из свойств req.session не было добавлено.

Вот файл моего сервера:

const express = require('express')
const parser = require('body-parser')
const cors = require('cors')
const partials = require('express-partials')
const session = require('express-session')
const cookieParser = require('cookie-parser')

const PORT = 3000
const App = express()

const { checkIfExistingUser } = require('./helpers/utilities.js')
const { userRouter } = require('./users/userRouter.js')
const { eventRouter } = require('./events/eventRouter.js')
const { calendarRouter } = require('./calendars/calendarRouter.js') 

App.use(cors())
App.use(partials())
App.use(parser.json())
App.use(parser.urlencoded({extended: true}))
App.use(cookieParser())

App.set('trust proxy', 1)
App.use(session({
  secret: 'keyboard cat',
  resave: false,
  saveUninitialized: false,
  cookie: {
    expires: 60000
  }
}))

App.use('/users', userRouter)
App.use('/calendar/show', calendarRouter) 
App.use('/calendar', eventRouter) 

//login attempt
App.post('/login', (req, res) => {
  checkIfExistingUser(req, res).then((user) => {
    if (!user) {
      res.status(400)
      res.json({message: 'Invalid username or password'})
    } else {
      req.session.authentication = true
      req.session.userId = user.id
      req.session.name = user.name
      req.session.email = user.email
      req.session.password = user.password
      console.log('req.session.name: ', req.session.name)
      req.session.save(() => {
        console.log('saved')
        res.status(200)
        res.send({token: process.env.ACCESS_TOKEN})
      })
    }
  }) 
})

App.listen(PORT, err => {
  err ? console.log('Failed to start server: ', err) : 
console.log('Listening on Port: ', PORT)
})

Вот моя функция, которая ищет пользователя при попытке входа в систему (данные хранятся в файле .json):

require('dotenv').config()

const fs = require('fs')
const es = require('event-stream')
const bcrypt = require('bcrypt-nodejs')
const userStream = fs.createReadStream('./users/userData.json', {flags: 'r', encoding: 'utf-8'})

const checkIfExistingUser = async (req, res) => {
  const email = req.body.email
  const password = req.body.password
  let userNotFound = true
  let userId = 0
  let userName = ''
  await readData(userStream, (user) => {
    if (user.email === email) {

      if (user.password === password) {
        userId = user.id
        userNotFound = false
        userName = user.name
      }
    }  
  })
  if (userNotFound) {
    return false
  } else {
    return {id: userId, name: userName, email: email, password: password}
  }

}

const readData = (stream, action) => {
  stream.pipe(es.split())
    .pipe(es.mapSync((dataEntry) => {
      if (dataEntry.length > 0) {
    action(JSON.parse(dataEntry))
      }
    }))
  stream.on('error', (err) => {
    console.log('Error reading file: ', err)
  })
  stream.on('close', () => {
    console.log('Done reading')
  })
}

И еще одна функция - мой signupNewUser, который также не получает сеанс для сохранения:

require('dotenv').config()
const fs = require('fs')
const bcrypt = require('bcrypt-nodejs')

const userReadStream = fs.createReadStream('./users/userData.json', {flags: 'r', encoding: 'utf-8'})

const { readData } = require('../helpers/utilities.js')

const userModels = {
  getUser: async (req, res) => {
    console.log('req.body: ', req.body)
    const loggedInUser = {}
    await readData(userReadStream, (user) => {
      console.log('user: ', user)
      if (user.email === req.session.email) {
        loggedInUser = user
      }
    })
    res.status(200)
    res.send({user: loggedInUser})
  },

  signUpNewUser: async (req, res) => {
    let userDoesNotExist = true
    let lastUserID = 0
    await readData(userReadStream, (user) => {
      lastUserID = user.id
      if (user.email === req.body.user.email) {
        console.log('same')
        userDoesNotExist = false
        userReadStream.close()
      }
    })
    if (userDoesNotExist) {
        const newUser = {
          id: lastUserID + 1,
          name: req.body.user.name,
          email: req.body.user.email,
          password: req.body.user.password
        }
        req.session.authentication = true
        req.session.email = req.body.user.email
        req.session.password = req.body.user.password
        req.session.userId = newUser.id
        const userWriteStream = fs.createWriteStream('./users/userData.json', {'flags': 'a'})
        userWriteStream.write(JSON.stringify(newUser)+'\n')
        userWriteStream.on('error', (error) => {
          res.status(400)
          res.json({message: 'error signing up user'})
          console.log('error signing up user: ', error)
        })
        userWriteStream.end(() => {
          console.log('Done adding user')
          req.session.save(() => {
            res.status(200)
            res.json({user: newUser, token: process.env.ACCESS_TOKEN})
          })
        }) 
    } else {
      res.status(400)
      res.send({message: 'User already exists'})
    }
  }
}

module.exports = {
  userModels
}

Функции входа и регистрации выполняют то, что они должны делать, за исключением того, что частигде я устанавливаю свойства 'req.session', они никогда не создаются.У меня хорошее предчувствие, что это асинхронная проблема, но я пока не смог ее выяснить и все время искал, как ее исправить.Любая помощь будет принята с благодарностью.

...