无法使用 Vue + Express 保存会话

Posted

技术标签:

【中文标题】无法使用 Vue + Express 保存会话【英文标题】:Can not save session with Vue + Express 【发布时间】:2018-06-12 00:16:40 【问题描述】:

我在服务器端使用 ExpressJS 和 Vue 在前端。我想保存会话,但我不能用 Vue 前端来做到这一点。我找不到这个/服务器端的解决方案是:

    let express = require('express');

let path = require('path');
let favicon = require('serve-favicon');
let logger = require('morgan');
let cookieParser = require('cookie-parser');
let bodyParser = require('body-parser');


var session = require('express-session')
// const MongoStore = require('connect-mongo')(express_session);

let index = require('./src/routes/index');
let users = require('./src/routes/users');
let gallery = require('./src/routes/gallery')
let auth = require('./src/routes/auth')
let contacts = require('./src/routes/contacts')
let services = require('./src/routes/services')


let cors = require('cors')

let app = express();

app.use(cors(
   origin:['http://localhost:8080'],
    methods:['GET','POST'],
    credentials: true // enable set cookie
))


let mongoose = require('mongoose')


let express_session = require("express-session");
const MongoStore = require('connect-mongo')(express_session);




//авторизация
app.use(session(
    secret: 'keyboard',
     resave: false,
     saveUninitialized: true,
    store: new MongoStore(
        url: 'mongodb://localhost/studio'
    )
))



let mongoDB = 'mongodb://127.0.0.1/studio';
mongoose.connect(mongoDB, 
    useMongoClient: true
);

let db = mongoose.connection;

db.on('error', console.error.bind(console, 'MongoDB connection error:'));

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded( extended: false ));


//app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', index);
app.use('/users', users);
app.use('/gallery', gallery );
app.use('/contacts', contacts );
app.use('/auth', auth);
app.use('/services', services );


//Авторизация в данной система


// catch 404 and forward to error handler
app.use(function(req, res, next) 
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
);


// error handler
app.use(function(err, req, res, next) 
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : ;

  // render the error page
  res.status(err.status || 500);
  res.render('error');
);

//app.listen(3002);


module.exports = app;

我将会话保存在猫鼬中,当我检查服务器端会话是否正常工作时。但是当我想在 Vue 端保存会话时它不起作用。我认为这是因为cors,但它没有帮助。 这里的vue代码:

<template>
  <div class="hello">
    <h1> msg </h1>
    <h2>Essential Links</h2>
    <ul>
      <li><a href="https://vuejs.org" target="_blank">Core Docs</a></li>
      <li><a href="https://forum.vuejs.org" target="_blank">Forum</a></li>
      <li><a href="https://chat.vuejs.org" target="_blank">Community Chat</a></li>
      <li><a href="https://twitter.com/vuejs" target="_blank">Twitter</a></li>
      <br>
      <li><a href="http://vuejs-templates.github.io/webpack/" target="_blank">Docs for This Template</a></li>
    </ul>
    <h2>Ecosystem</h2>
    <ul>
      <li><a href="http://router.vuejs.org/" target="_blank">vue-router</a></li>
      <li><a href="http://vuex.vuejs.org/" target="_blank">vuex</a></li>
      <li><a href="http://vue-loader.vuejs.org/" target="_blank">vue-loader</a></li>
      <li><a href="https://github.com/vuejs/awesome-vue" target="_blank">awesome-vue</a></li>
    </ul>
  </div>
</template>

<script>
export default 
  name: 'HelloWorld',
  data () 
    return 
      msg: 'Welcome to Your Vue.js App',
      page_views:undefined,
    
  ,
  beforeMount()
    this.$http.get("http://localhost:8120/").then((res)=>
        if(!res.body.session)
          console.log("Session not exist "+res.body.message)
          this.msg = res.body.message;
        
        else
          console.log("Session exist "+res.body.page_views)
          this.msg  = res.body.page_views
        
    ,(err)=>
      console.log(err)
    )
  

</script>

这里的端点代码是:

var express = require('express');
var router = express.Router();

let cors = require('cors')
router.use(cors())

/* GET home page. */
router.get('/', function(req, res)
   if(req.session.page_views)
      req.session.page_views++;
      res.json(session:true,page_views:req.session.page_views);
    else 
      req.session.page_views = 1;
      res.json(session:false, message:"Welcome to this page for the first time!")
   
);


module.exports = router;

【问题讨论】:

你好,你还没解决吗? 【参考方案1】:

你的后端代码没问题,你知道设置 credentials: true // enable set cookie 避免(同源策略)。 但我认为前端也需要设置凭据。 你可以试试这个:

this.$http.get("http://localhost:8120/", credentials: true).then( res => 
   ...do someting 
,(err)=>
  ... do someting
)

表示允许浏览器发送cookie到后端 祝你好运!

【讨论】:

以上是关于无法使用 Vue + Express 保存会话的主要内容,如果未能解决你的问题,请参考以下文章

Express 和 Redis 会话无法在浏览器关闭后继续存在

无法从带有 Socket.IO 的 cookie 中获取 Express 会话 ID

无法在vue端显示express res.send()自定义的错误信息。

我正在学习 express 和 mongoose,我无法保存要保存的模式,但可以通过 console.log() 看到它

我正在学习 express 和 mongoose,我无法保存要保存的模式,但可以通过 console.log() 看到它

使用CURL发出多个请求时无法保存会话