Мое приложение включает в себя вход в систему и регистрацию пользователей.При правильном входе в систему я устанавливаю для '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', они никогда не создаются.У меня хорошее предчувствие, что это асинхронная проблема, но я пока не смог ее выяснить и все время искал, как ее исправить.Любая помощь будет принята с благодарностью.