Ankündigung

Einklappen
Keine Ankündigung bisher.

js express-session erstellt für jeden request eine neue ID

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • js express-session erstellt für jeden request eine neue ID

    Hallo,

    ich baue eine Applikation mit node.js und expressjs.

    Der versuch eine Variable in Session zu speichern gelingt. Allerdings wird bei jedem neuen Request eine neue Session gestartet. Somit änder sich die sessionId und ich kann nicht mehr auf meine Variable zugreifen...
    Code:
    var express = require('express')
    var http = require('http')
    var path = require('path')
    var reload = require('reload')
    var bodyParser = require('body-parser')
    var logger = require('morgan')
    var session = require('express-session')
    
    var app = express()
    var publicDir = path.join(__dirname, 'public')
    
    app.set('port', process.env.PORT || 3000);
    app.use(logger('dev'));
    app.use(bodyParser.json());
    app.use(session({
        secret: '1q2w3e4r5t',
        saveUninitialized: true,
        resave: true,
        cookie: {
            expires: 600000,
            secure: false
        }
    }));
    
    var sess;
    app.post('/order', function (request, response) {
        console.log(
            request
        );
        request.session.someField = 'foo';
        request.session.save();
        response.write('done');
        response.end();
    });
    var server = http.createServer(app)
    
    /**
     * Reload code here
     */
    reload(app).then(function (reloadReturned) {
      // reloadReturned is documented in the returns API in the README
    
      // Reload started, start web server
      server.listen(app.get('port'), function () {
        //console.log(myApp)
        console.log('Web server listening on port ' + app.get('port'))//, myApp)
      })
    }).catch(function (err) {
        console.error('Reload could not start, could not start server/sample app', err)
        return;
    })
    Nach dem Start ses Servers schicke ich 3 Requests's:
    Code:
    G:\PROJECTS\MODULES\dot-source\dev>curl -d "@data.json" -H "Content-Type: application/json" -X POST http://localhost:3000/order
    Warning: Couldn't read data from file "data.json", this makes an empty POST.
    done
    G:\PROJECTS\MODULES\dot-source\dev>curl -d "@data.json" -H "Content-Type: application/json" -X POST http://localhost:3000/order
    Warning: Couldn't read data from file "data.json", this makes an empty POST.
    done
    G:\PROJECTS\MODULES\dot-source\dev>curl -d "@data.json" -H "Content-Type: application/json" -X POST http://localhost:3000/order
    Warning: Couldn't read data from file "data.json", this makes an empty POST.
    done
    G:\PROJECTS\MODULES\dot-source\dev>
    mit folgendem Ergebnis:
    Code:
    sessions: [Object: null prototype] {
          '2LzSgVGeY_V1J4xbnq4A2lnKXUO4xUWD': '{"cookie":{"originalMaxAge":600000,"expires":600000,"secure":false,"httpOnly":true,"path":"/"},"someField":"foo"}',
          aO35rvqbtUgx9XqfzoFRAdCE2c4EpDhZ: '{"cookie":{"originalMaxAge":600000,"expires":600000,"secure":false,"httpOnly":true,"path":"/"},"someField":"foo"}'
        },
        generate: [Function]
      },
      sessionID: 'UdSzm_CCrR0nrpouzZDjyMM9VcmSyW3B',
      session: Session {
        cookie: {
          path: '/',
          _expires: 600000,
          originalMaxAge: 600000,
          httpOnly: true,
          secure: false
        }
      },
      route: Route { path: '/order', stack: [ [Layer] ], methods: { post: true } }
    }
    POST /order 200 30.476 ms - -
    Also, die session ist gespeichert, und meine gesetzte Variable ist auch da,. Aber warum wird mit jedem Request eine neue Session geschrieben?
    Code:
    2LzSgVGeY_V1J4xbnq4A2lnKXUO4xUWD <--- Request #1
    aO35rvqbtUgx9XqfzoFRAdCE2c4EpDhZ <--- Request #2
    UdSzm_CCrR0nrpouzZDjyMM9VcmSyW3B <--- Request #3
    Das Ergebnis der Suche im Netz favorisiert cookie secure auf false setzen, da sonst kein bei einer http-Anfrage kein Cookie zurückgegeben wird, aber bei mir bleibt das auch ohne Effekt...

    Danke schon mal für jegliche Hilfe

  • #2
    Vll wegen der Resave Option, welche laut Dokumentation auch veraltet ist.
    https://github.com/expressjs/session#resave

    PS: Du bekommst ja ne Cookie ID mit, diese muss soweit ich weiß beim nächsten Request ja wieder mitgeschickt werden, sonst wirst du immer eine neue Session bekommen!

    Kommentar


    • #3
      Zitat von Zeichen32 Beitrag anzeigen
      Vll wegen der Resave Option, welche laut Dokumentation auch veraltet ist.
      https://github.com/expressjs/session#resave
      mit resave:false bekomme ich das gleiche Ergebnis...
      Zitat von Zeichen32 Beitrag anzeigen
      Vll wegen der Resave Option, welche laut Dokumentation auch veraltet ist.
      [URL]PS: Du bekommst ja ne Cookie ID mit, diese muss soweit ich weiß beim nächsten Request ja wieder mitgeschickt werden, sonst wirst du immer eine neue Session bekommen!
      Wie meinst du mit der Cookie ID? Ist das die SessionId? Wie setze ich die?

      Kommentar


      • #4
        Ich kenne mich mit Curl direkt auf der Command Line nicht so aus. Aber es gibt ja so tolle Tools wie Postman, wo man das alles Einstellen kann.

        Kommentar


        • #5
          Ich habe das erstmal mit einem Workaround gelöst:
          • check ob sich schon eine Session im request.sessionStore.sessions befindet
          • wenn nicht wird Variable custom gesetzt und mit Werten gefüllt
          • die aktuelle request.sessionStore.sessions wird leer gemacht
          • wenn sich eine Variable custom im SessionStore befindet, wird diese in an request.session.customs übergeben
          Code:
          ...
          app.post('/order', function (request, response) {
          
              /**
               * workaround for session variable
               */
              console.log(
                  request.sessionStore.sessions,
                  Object.keys(request.sessionStore.sessions)[0]
              );
              if (typeof Object.keys(request.sessionStore.sessions)[0] === 'undefined') {
                  request.session.customs = {
                      'basket': { 1: 5, 2: 3 }
                  };
              } else {        
                  sessionId = Object.keys(request.sessionStore.sessions)[0];
                  let currentCustoms = JSON.parse(request.sessionStore.sessions[sessionId]).customs;
          
                  console.log(currentCustoms);
                  currentCustoms.basket[1] = 6;
                  console.log(currentCustoms);
          
                  request.sessionStore.sessions = {};
                  request.session.customs = currentCustoms;
              }
              ...
          }
          Code ausführen
          Code:
          G:\PROJECTS\MODULES\dot-source\dev>curl -d "@data.json" -H "Content-Type: application/json" -X POST http://localhost:3000/order
          Warning: Couldn't read data from file "data.json", this makes an empty POST.
          done
          G:\PROJECTS\MODULES\dot-source\dev>curl -d "@data.json" -H "Content-Type: application/json" -X POST http://localhost:3000/order
          Warning: Couldn't read data from file "data.json", this makes an empty POST.
          done
          G:\PROJECTS\MODULES\dot-source\dev>curl -d "@data.json" -H "Content-Type: application/json" -X POST http://localhost:3000/order
          Warning: Couldn't read data from file "data.json", this makes an empty POST.
          done
          G:\PROJECTS\MODULES\dot-source\dev>curl -d "@data.json" -H "Content-Type: application/json" -X POST http://localhost:3000/order
          Warning: Couldn't read data from file "data.json", this makes an empty POST.
          done
          G:\PROJECTS\MODULES\dot-source\dev>
          Ergebnis
          Code:
          Starting child process with 'node server.js'
          Web server listening on port 3000
          [Object: null prototype] {} undefined
          POST /order 200 18.580 ms - -
          [Object: null prototype] {
            'SO-8FAkPH7xvhiGFGUfj99cjOCG5Uf1n': '{"cookie":{"originalMaxAge":600000,"expires":"2020-02-12T17:36:47.241Z","secure":false,"httpOnly":true,"path":"/"},"customs":{"basket":{"1":5,"2":3}}}'
          } SO-8FAkPH7xvhiGFGUfj99cjOCG5Uf1n
          { basket: { '1': 5, '2': 3 } }
          { basket: { '1': 6, '2': 3 } }
          POST /order 200 4.031 ms - -
          {
            'mSQVW-JAj6nLFh-e5ebW-NPUGX6qDzzg': '{"cookie":{"originalMaxAge":600000,"expires":"2020-02-12T17:36:48.354Z","secure":false,"httpOnly":true,"path":"/"},"customs":{"basket":{"1":6,"2":3}}}'
          } mSQVW-JAj6nLFh-e5ebW-NPUGX6qDzzg
          { basket: { '1': 6, '2': 3 } }
          { basket: { '1': 6, '2': 3 } }
          POST /order 200 3.434 ms - -
          {
            c68zqaMWLZnJ0sY9U4UYcah5Sbd_xnCS: '{"cookie":{"originalMaxAge":600000,"expires":"2020-02-12T17:36:49.234Z","secure":false,"httpOnly":true,"path":"/"},"customs":{"basket":{"1":6,"2":3}}}'
          } c68zqaMWLZnJ0sY9U4UYcah5Sbd_xnCS
          { basket: { '1': 6, '2': 3 } }
          { basket: { '1': 6, '2': 3 } }
          POST /order 200 3.351 ms - -
          Das kann definitiv nur eine temporäre Lösung sein, funktionirtt ja auch nur bein einem User. Deshalb hoffe ich auf weitere Lösung/en.

          Kommentar


          • #6
            Zitat von Zeichen32 Beitrag anzeigen
            Ich kenne mich mit Curl direkt auf der Command Line nicht so aus. Aber es gibt ja so tolle Tools wie Postman, wo man das alles Einstellen kann.
            Oder Du schickst Dein Formular mithilfe einer HTMLSeite über den Brwoser, der< macht sowas normalerweise ganz gut.
            bar die Curl Cookie seite hast Du ja sicher schon durch:
            https://curl.haxx.se/docs/http-cookies.html

            Kommentar


            • #7
              Zitat von tomBuilder Beitrag anzeigen
              ...
              Oder Du schickst Dein Formular mithilfe einer HTMLSeite über den Brwoser, der< macht sowas normalerweise ganz gut.
              ...
              Ja, der macht das, aber ich wollte (sollte) das mit curl machen.

              Die Antwort auf diese Frage hat mir nun bei der Lösung geholfen:
              Code:
              curl -b cookies.txt -c cookies.txt
              -b tells curl to store incoming cookies in cookies.txt and -c tells curl to embed all cookies from cookies.txt into this request.
              Vielen Dank tomBuilder und Zeichen32

              Kommentar

              Lädt...
              X