#node.js #session #express #cookies #express-session
#node.js #сеанс #экспресс #файлы cookie #экспресс-сессия
Вопрос:
У меня возникла проблема с доступом к сохраненному объекту req.session. Кажется, что он обращается к новому запросу.сеанс с новым вызовом api.
Это мой server.js
const logger = require('morgan');
const express = require('express');
const bodyParser = require('body-parser');
const session = require('express-session');
const cookieParser = require('cookie-parser');
const path = require('path');
const apiRoute = require('./routes/api');
const webpack = require('webpack');
const config = require('./webpack.config');
const app = express();
const compiler = webpack(config);
const port = process.env.PORT || 3000
app.use(express.static(path.join(__dirname, 'dist')));
app.use(logger('dev'))
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser("sdd", {signed: true}))
app.use(session({
secret: 'superSecretCodez',
resave:true,
saveUninitialized:true,
cookie: { maxAge: 60000 }
}))
app.use('/api', apiRoute)
app.listen(port, () => {
console.log('Server is listening on port', port);
})
Мой первоначальный запрос api — это запрос get,
router.get('/start', createGame, (req, res) => {
res.status(200).json({response: res.game});
})
function createGame(req, res, next){
if(req.originalUrl === '/api/start'){
const game = new BattleShip();
console.log(game)
res.game = game
req.session.game = res.game
req.session.save(function(err){
console.log('session saved');
console.log("Session Before Redirect: ", req.session);
})
}
next();
}
и при просмотре объекта req.session там req.session.game находится в req.session.
session saved
Session Before Redirect: Session {
cookie:
{ path: '/',
_expires: 2016-10-11T03:18:40.520Z,
originalMaxAge: 60000,
httpOnly: true },
game:
BattleShip {
cpuBoard: [ [Object], [Object], [Object], [Object], [Object] ],
playerBoard: [ [Object], [Object], [Object], [Object], [Object] ],
cpuCoordinates: [],
playerCoordinates: [],
playerSelections: [],
cpuSelections: [] } }
BattleShip {
cpuBoard:
[ [ 'A0', 'A1', 'A2', 'A3', 'A4' ],
[ 'B0', 'B1', 'B2', 'B3', 'B4' ],
[ 'C0', 'C1', 'C2', 'C3', 'C4' ],
[ 'D0', 'D1', 'D2', 'D3', 'D4' ],
[ 'E0', 'E1', 'E2', 'E3', 'E4' ] ],
playerBoard:
[ [ 'A0', 'A1', 'A2', 'A3', 'A4' ],
[ 'B0', 'B1', 'B2', 'B3', 'B4' ],
[ 'C0', 'C1', 'C2', 'C3', 'C4' ],
[ 'D0', 'D1', 'D2', 'D3', 'D4' ],
[ 'E0', 'E1', 'E2', 'E3', 'E4' ] ],
cpuCoordinates: [],
playerCoordinates: [],
playerSelections: [],
cpuSelections: [] }
Проблема возникает позже, когда я выполняю post-запрос и пытаюсь получить доступ к тому же сеансу, чтобы обновить его.
router.post('/setShips', setPlayerShips, createCpuCoordinates, (req, res) => {
res.status(200).json({response: res.cpuCoordinates})
// set up coordinates, players div should be updated with divs
})
function setPlayerShips(req, res, next){
console.log(req)
console.log(req.session)
console.log(req.session.game)
if(req.originalUrl=== '/api/setShips'){
res.playerCoordinates = req.body
req.session.game.BattleShip.playerCoordinates = res.playerCoordinates
}
next();
}
Похоже, что он обращается к совершенно другому файлу cookie, у которого нет req.session.game. однако в объекте req в хранилище сеансов есть объекты сеанса.
sessionStore:
MemoryStore {
domain: null,
_events:
{ disconnect: [Function: ondisconnect],
connect: [Function: onconnect] },
_eventsCount: 2,
_maxListeners: undefined,
sessions:
{ i2R3lJZxEneAheOciHO9QX7_dCjOyFPG: '{"cookie":{"originalMaxAge":60000,"expires":"2016-10-11T03:18:40.487Z","httpOnly":true,"path":"/"},"game":{"cpuBoard":[["A0","A1","A2","A3","A4"],["B0","B1","B2","B3","B4"],["C0","C1","C2","C3","C4"],["D0","D1","D2","D3","D4"],["E0","E1","E2","E3","E4"]],"playerBoard":[["A0","A1","A2","A3","A4"],["B0","B1","B2","B3","B4"],["C0","C1","C2","C3","C4"],["D0","D1","D2","D3","D4"],["E0","E1","E2","E3","E4"]],"cpuCoordinates":[],"playerCoordinates":[],"playerSelections":[],"cpuSelections":[]}}',
'MLxoJNCuxn29GO-cCZyisjUwdLGhHf6l': '{"cookie":{"originalMaxAge":60000,"expires":"2016-10-11T03:18:41.083Z","httpOnly":true,"path":"/"},"game":{"cpuBoard":[["A0","A1","A2","A3","A4"],["B0","B1","B2","B3","B4"],["C0","C1","C2","C3","C4"],["D0","D1","D2","D3","D4"],["E0","E1","E2","E3","E4"]],"playerBoard":[["A0","A1","A2","A3","A4"],["B0","B1","B2","B3","B4"],["C0","C1","C2","C3","C4"],["D0","D1","D2","D3","D4"],["E0","E1","E2","E3","E4"]],"cpuCoordinates":[],"playerCoordinates":[],"playerSelections":[],"cpuSelections":[]}}' },
generate: [Function] },
sessionID: 'aHfVNblu917HOdlRR1kbIqb9JsUFfM-6',
session:
Session {
cookie:
{ path: '/',
_expires: 2016-10-11T03:18:48.163Z,
originalMaxAge: 60000,
httpOnly: true } },
route:
Route {
path: '/setShips',
stack: [ [Object], [Object], [Object] ],
methods: { post: true } } }
Session {
cookie:
{ path: '/',
_expires: 2016-10-11T03:18:48.163Z,
originalMaxAge: 60000,
httpOnly: true } }
undefined
TypeError: Cannot read property 'BattleShip' of undefined
at setPlayerShips (/Users/dfrank/code/projects/battleShip/api/game_controls.js:34:23)
at Layer.handle [as handle_request] (/Users/dfrank/code/projects/battleShip/node_modules/express/lib/router/layer.js:95:5)
at next (/Users/dfrank/code/projects/battleShip/node_modules/express/lib/router/route.js:131:13)
at Route.dispatch (/Users/dfrank/code/projects/battleShip/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/Users/dfrank/code/projects/battleShip/node_modules/express/lib/router/layer.js:95:5)
at /Users/dfrank/code/projects/battleShip/node_modules/express/lib/router/index.js:277:22
at Function.process_params (/Users/dfrank/code/projects/battleShip/node_modules/express/lib/router/index.js:330:12)
at next (/Users/dfrank/code/projects/battleShip/node_modules/express/lib/router/index.js:271:10)
at Function.handle (/Users/dfrank/code/projects/battleShip/node_modules/express/lib/router/index.js:176:3)
at router (/Users/dfrank/code/projects/battleShip/node_modules/express/lib/router/index.js:46:12)
at Layer.handle [as handle_request] (/Users/dfrank/code/projects/battleShip/node_modules/express/lib/router/layer.js:95:5)
at trim_prefix (/Users/dfrank/code/projects/battleShip/node_modules/express/lib/router/index.js:312:13)
at /Users/dfrank/code/projects/battleShip/node_modules/express/lib/router/index.js:280:7
at Function.process_params (/Users/dfrank/code/projects/battleShip/node_modules/express/lib/router/index.js:330:12)
at next (/Users/dfrank/code/projects/battleShip/node_modules/express/lib/router/index.js:271:10)
at session (/Users/dfrank/code/projects/battleShip/node_modules/express-session/index.js:438:7)
Как мне получить доступ к объекту сеанса, который был изначально создан? Дайте мне знать, если я могу предоставить дополнительную информацию. Спасибо!
Комментарии:
1. Кто выполняет вызовы API и сохраняют ли они cookie от одного запроса к следующему?
2. @jfriend00 таким образом, вызовы api выполняются через клиентскую часть приложения react на сервер. я не уверен, сохраняют ли они файл cookie, как мне это выяснить? когда я настраиваю сеансы, у меня есть набор файлов cookie с максимальным возрастом 6000.
3. Если это вызов ajax из javascript на основе браузера, и браузер не настроен на удаление или блокировку файлов cookie, и путь к файлу cookie сеанса совместим с разными страницами, и срок действия файла cookie достаточно длительный, и вы используете один и тот же источник для каждого вызова API, то файлы cookie сохраняются автоматически.
4. Вы можете проверить cookie, отправляемый с каждым запросом, на вкладке сеть отладчика Chrome, чтобы точно увидеть, что он отправляет на сервер.
5. Так что это не вызов ajax, я на самом деле использую выборку, например: fetch(‘/ api / setShips’,{метод: ‘post’, тело: координаты, заголовки: { ‘Accept’: ‘application / json’, ‘Content-Type’: ‘application / json’ } }).затем (ответ => response.json()).затем (результат => { this.setState({ cpuCoordinates: result.response, статус: ‘waiting_for_player_turn’ }) }) странно то, что между первым и вторым запросом отправляются разные файлы cookie