Как получить сеансы, которые были добавлены после подключения socket.io в socket.request - PullRequest
0 голосов
/ 07 апреля 2019

Я хочу получить свойство user в сеансе после входа в систему, но когда я устанавливаю сеанс после входа в систему, socket.request.session не изменяется, в нем нет свойства user. Но я могу получить его в router.post.

Я пытался редактировать сеансы в router.post()/router.get(), socket.request.session все еще не изменилось.

index.js

const io = require('socket.io').listen('8082', { origins: '*' })
const schedule = require('node-schedule')

io.set('transports', [
  'websocket',
  'flashsocket',
  'htmlfile',
  'xhr-polling',
  'jsonp-polling',
  'polling'
])
io.set('origins', '*:*')

const app = new express()

const sessionStore = new session.MemoryStore({ reapInterval: 3600 * 1000 })
const sessionMiddleware = session({
    secret: 'Stefanie Sun',
    store: sessionStore,
    resave: false, 
    saveUninitialized: true,
    cookie: { 
        maxAge: 8 * 3600 * 1000,
        secure: false
  }, 
    rolling: true
})
io.use((socket, next) => {
  sessionMiddleware(socket.request, socket.request.res, next);
})
app.use(sessionMiddleware)
routes(app)

io.on('connection', (socket) => {
  const comment_schedule = schedule.scheduleJob('*/10 * * * * *', async () => {         /** 10s查询一次是否有新的内容 **/
    const COOKIE_STR = socket.request.session
    console.log(COOKIE_STR)
  })
})

router.js

...
router.post('/pagelist', (req, res, next) => {
  req.session.user = { username: 'test1', gender: 'x', bio: 'this is a test' }
  console.log(req.session)
  res.status(200).json({ code: 'OK' })
}
app.user('/api/page', router)

когда я посетил /api/page/pagelist после входа в систему, я хотел бы получить тот же сеанс в socket.request и req.session в router.post, но socket.request.session это

Session {
  cookie:
   { path: '/',
     _expires: 2019-04-07T22:57:13.379Z,
     originalMaxAge: 28800000,
     httpOnly: true,
     secure: false } }

но в router.post req.session это

Session {
  cookie:
   { path: '/',
     _expires: 2019-04-07T22:57:48.146Z,
     originalMaxAge: 28799999,
     httpOnly: true,
     secure: false },
  user:
   { 
     username: 'test1',
     gender: 'x',
     bio: 'this is a test'
}}

Я надеюсь, что socket.request.session я также могу получить user собственность.

Мой проект по созданию шрифтов с Vue.js. И я установил socket.on('event') в home.vue. Я подключаю socket.io до входа на страницу, и после входа я устанавливаю свойство пользователя в сеансе, я не могу получить это свойство в socket.request.session.

код входа в веб-интерфейс

// api.js
export const loginApi = ({ username, password } = { username: '', password: '' }) => {
    const data = {
        username,
        password
    };
    return axios.request({
        url: '/api/signin',
        data: qs.stringify(data),
        method: 'post'
    })
}

// login.vue
submit() {
    loginApi({ username: this.username, password: this.password})
       .then((result: any) => {
            this.$toast.success('login success');
            this.Cookies.set('user', this.username, { expires: 7 });
            getUserInfo(this.username).then((res: any) => {
                const { data } = res;
                localStorage.setItem('user', JSON.stringify(data));
                const url = this.redirect && this.redirect || '/pages';
                this.$router.push(url);
            })
        })
}
...