如何使子应用程序可以访问会话变量

时间:2017-02-04 00:52:48

标签: javascript node.js express

我正在构建一个api,它将与MongoDB数据库连接并将其作为子应用程序安装。我在服务器控制器中定义了一个会话变量。 但是,只要服务器文件需要与api文件通信,会话变量就不会被传递掉。 继承人app.js文件

//app.js file
'use strict';
process.env.NODE_ENV = 'development';
var express = require('express');
var bodyParser = require('body-parser');
var mongoose = require('mongoose');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var session = require('express-session');
var MongoStore = require('connect-mongo')(session);
var flash = require('connect-flash');
var helmet = require('helmet');


var app = express();
app.use(helmet());
var port = process.env.PORT || 3000;
mongoose.connect("mongodb://localhost:27017/striv4");
var db = mongoose.connection;

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

app.use(session({
  secret: 'secret',
  resave: true,
  saveUninitialized: false,
  store: new MongoStore({
    mongooseConnection: db
  })
}));
app.use(flash());
// make user ID available in templates
app.use(function (req, res, next) {
  res.locals.currentUser = {
                            username:req.session.username,
                            id: req.session.userId
                          };
  next();
});
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser('secreter'));
app.use(logger('dev'));

var api = require('./app_api/routes/index');
var serverRoutes = require('./server/routes/index');

//static file middleware
app.use(express.static(__dirname + '/public'));
app.set('views',__dirname +'/server/views');
app.set('view engine','pug');

app.use('/',serverRoutes);
app.use('/api',api);



//custom error handler
app.use(function(error, req, res, next) {
  res.status(error.status || 500);
  res.send('Error: '+error.message);
});
app.listen(port);
console.log('Listening on port: '+port);

1 个答案:

答案 0 :(得分:0)

您已经列出了整个程序,因此出现错误的方法不止一种。以下是我的建议:

  1. 检查您已安装的express-session版本。 (只需在终端和您的npm ls文件所在的根节点应用文件夹中运行package.json。如果它等于或大于v1.5.0,则不再需要cookie-parser用于会话。注释掉cookie解析器的app.use行,看看是否有效。
  2. 如果由于其他原因仍需要cookie解析器,则应使用会话和cookie解析器的相同秘密。在您的代码中,您为secret设置了两个不同的值。
  3. 我已经看到,如果会话存储未正确连接到您的Node应用程序,则会发生其他大的会话失败。交叉检查数据库是否可用并正常工作。根据我的经验,如果无法访问数据库,Express会话将无声地失败
  4. 希望这有帮助。