Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 会话未使用express会话和connect会话续集持久化_Node.js_Express_Session_Sequelize.js_Session Cookies - Fatal编程技术网

Node.js 会话未使用express会话和connect会话续集持久化

Node.js 会话未使用express会话和connect会话续集持久化,node.js,express,session,sequelize.js,session-cookies,Node.js,Express,Session,Sequelize.js,Session Cookies,我正在使用Sequilize库连接MySql数据库。一切正常。但是,每次重新加载浏览器时,会话都不会持久化。一个新的会话将以null userId存储在数据库中,有时甚至不止一个。我不知道为什么。我正在从express服务器上为我的VUESPA服务,它工作得非常好 我研究了StackOverflow,一些解决方案指向cors,但我只为VUE和Node使用一个端口,所以应该没有问题。我们将非常感谢您的帮助 下面是代码以及一些显示会话数据库中的行的图像 这是应用程序初始化的代码。 这是app.js文

我正在使用Sequilize库连接MySql数据库。一切正常。但是,每次重新加载浏览器时,会话都不会持久化。一个新的会话将以null userId存储在数据库中,有时甚至不止一个。我不知道为什么。我正在从express服务器上为我的VUESPA服务,它工作得非常好

我研究了StackOverflow,一些解决方案指向cors,但我只为VUE和Node使用一个端口,所以应该没有问题。我们将非常感谢您的帮助

下面是代码以及一些显示会话数据库中的行的图像

这是应用程序初始化的代码。 这是app.js文件的代码


我认为这是登录功能中的一个问题
const bodyParser = require('body-parser')
const cors = require('cors')
const cookieParser = require('cookie-parser')
const passport = require('passport')
const GoogleStrategy = require('passport-google-oauth20')
const session = require('express-session')
// initalize sequelize with session store
var SequelizeStore = require("connect-session-sequelize")(session.Store);

const User = require("./models/User")

const Keys = require("./config/Keys")
const Db = require("./config/db")


module.exports = new class {

    initialize(app) {
      app.use(bodyParser.json());
      app.use(bodyParser.urlencoded({ extended: true }));
      app.use(cookieParser(Keys.secret));

      // passport

      /*
      Stores information in the cookie when the user is created
      */
      passport.serializeUser(function(user, cb) {
        // console.log("this is the id which is getting used for serializing "+user.id);
        cb(null, user.id);
      });

      /*
      Extract information from cookie when logged in user sends the request
      */
      passport.deserializeUser(function(id, done) {

        User.findByPk(id)
        .then(user => {
          if(user) {
            done(null, user);
          } else {
            done(null, null);
          }
        })
        .catch(err=>{
          done(null, null);
        })

      });

      // Google OAuth

      passport.use(
        new GoogleStrategy({
          clientID: Keys.google.client_id,
          clientSecret: Keys.google.client_secret,
          callbackURL: '/login/google/return'
        }, (accessToken, refreshToken, profile, done) => {
          User.findAll({where: {email: profile._json.email}})
          .then(user => {
            if(user.length > 0) {
              done(null, user[0]);
            } else {
              User.create({
                email: profile._json.email,
                emailVerified: profile._json.email_verified,
                roles: 'user'
              })
              .then(result=> {
                done(null, result);
              })
              .catch(err => {
                console.log("err");
                console.log(err);
              })
            }
          }) 
          
        })
      )

     function extendDefaultFields(defaults, session) {
       let r = {
        data: defaults.data,
        expires: defaults.expires
      };
       if(session.passport) {
         if(session.passport.user) {
          r.userId = session.passport.user;
         }
       }
      
        return r;
      }

      var myStore = new SequelizeStore({
        db: Db,
        table: "Session",
        extendDefaultFields: extendDefaultFields,
      });
      
      // configuring session
      app.use(
        session({
          secret: Keys.secret,
          store: myStore,
          resave: false, // we support the touch method so per the express-session docs this should be set to false
          proxy: false, // if you do SSL outside of node.
          cookie: {secure: false}
        })
      );  

      app.use(passport.initialize());
      app.use(passport.session());  
 
    }

}
require('dotenv').config();
const express = require('express')
const app = express()
let ejs = require('ejs');
const auth = require("./auth.js");
const siteConfig = require('./config/site.js');
const routes = require('./server-routes.js');
const db = require("./config/db.js")

async function ignite() {

    try {
        if (!process.env.MSG) {
          throw new Error("\nEnvironment variables are not working.\n")
        }

        db.authenticate()
        .then(() => console.log("connectedd"))

        auth.initialize(app);
        
        app.use('/', routes);
        console.log("request going to vue app");

        // Handle production
        if(process.env.NODE_ENV === 'development') {
          //static folder
          app.use(express.static(__dirname + '/public'));

          // handle SPA (Single Page Application)
          app.get(/.*/, (req,res) => {
            res.sendFile(__dirname + '/public/index.html');
          })
        }

        app.listen(siteConfig.port, () => {
            console.log(`ExamByPass server is running on ${ process.env.PORT || siteConfig.port }!`);
        });

    } catch (e) {
        console.log("FATAL IGNITION ERROR", '\n', e);
    }

}

ignite();