首页 > 解决方案 > 使用 express-session 登录,但是在设置 req.session 属性时,它们不保存

问题描述

我的应用程序涉及登录和注册用户。正确登录后,我在用户拥有的其他属性中将“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”属性的部分,它们永远不会被创建。我有一种很好的感觉,这是一个异步问题,但我还没有弄清楚它,并且一直在寻找如何解决它。任何帮助将不胜感激。

标签: javascriptnode.jsexpresssessionexpress-session

解决方案


推荐阅读