javascript - req.session 在 Node 中未定义?

标签 javascript node.js session express session-cookies

我已经查看了类似问题的其他答案,但没有一个对我有用。我有两段代码,一段用于测试 cookie 是否正常工作(cookieTest.js),另一段用于实际使用它们(users.js)。我尝试移动 session 中间件和 cookie 中间件的 app.use() 语句,但没有成功。关于如何解决这个问题有什么想法吗?

users.js

//Mongoose Setup
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
mongoose.connect("MY_DB");
var path = require('path');
var appDir = path.dirname(require.main.filename);
var bodyParser = require('body-parser')
var User = require('../models/user.js');
var passport = require('passport');
var LocalStrategy = require('passport-local');
var uuid = require('node-uuid');
var cookieParser = require('cookie-parser');
//Express Setup
var express = require('express');
var router = express.Router();
var app = express();
var expressValidator = require("express-validator");
var session = require('express-session');
app.use(bodyParser.urlencoded({ extended: false }));
app.use(expressValidator());
app.use(bodyParser.json());
app.use(cookieParser());
app.use(session({secret: '_secret_', cookie: { maxAge: 60 * 60 * 1000 }, saveUninitialized: false, resave: false}))
//Routes
router.get('/register', function(req, res){
  res.sendFile(appDir + "/views/register.html");
})
router.post('/register', function(req, res) {
  req.check('name', 'Name must be Filled in').notEmpty();
  req.check('email', 'Email must be Filled in').notEmpty();
  req.check('email', "Invalid Email").isEmail();
  req.check('password', 'Password Field must be Filled in').notEmpty();
  req.check('password', 'Passwords do not Match').equals(req.body.password2)
  var errors = req.validationErrors();
  if(errors) res.send(errors)
  else{
    var newUser = new User({
      name: req.body.name,
      email: req.body.email,
      password: req.body.password,
      info: req.body.user_bio
    });
    User.createUser(newUser, function(err, user){
            if(err) throw err;
    });
    res.redirect('../')
  }
})
router.get('/login', function(req, res){
  res.sendFile(appDir + "/views/login.html");
})
router.post('/login', function(req, res){
  var email = req.body.email;
  var candidatePass = req.body.password;
  User.findOne({ 'email': email }, 'password id', function (err, user) {
    if (err) return handleError(err);
    User.checkPassword(candidatePass, user.password, function(err, isMatch){
      if(err) throw err;
      if(!isMatch) res.end('Password Incorrect!');
      else{
        req.session.userId = user.id;
        res.redirect('../');
      }
    })
  })
})
//Exports
module.exports = router;

当我运行此命令时,我收到错误 TypeError: Cannot set property 'userId' of undefined,这意味着 req.session 未定义。但是,当我运行它时,它工作正常

var express = require('express');
var session = require('express-session');
var app = express();
var uuid = require('node-uuid');
var bodyParser = require('body-parser');

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

// Use the session middleware
app.use(session({
  secret: 'jaredasch',
  cookie: { maxAge: 60 * 60 * 1000 },
  saveUninitialized: false,
  resave: false
}))

// Access the session as req.session
app.get('/', function(req, res, next) {
  var sess = req.session
  if (sess.uuid) {
    res.setHeader('Content-Type', 'text/html');
    res.write('<p>Session UUID: ' + sess.uuid + '</p>');
    res.write('<p>expires in: ' + (sess.cookie.maxAge / 1000) + 's</p>');
    res.write('<form method = \'POST\'action = \'/\'><button type = \'submit\'></form>');
    res.end()
  } else {
    sess.uuid = uuid.v4();
    res.setHeader('Content-Type', 'text/html');
    res.write('Set Up Session \n')
    res.write('<p>Session UUID: ' + sess.uuid + '</p>');
    res.end('<p>expires in: ' + (sess.cookie.maxAge / 1000) + 's</p>');
  }
})

app.post('/', function(req,res){
  req.session.destroy(function(err) {
    if(err) throw err;
    console.log('Session Destroyed')
  })
  res.redirect('/');
})

app.listen(3000, function(){
  console.log('Listening on Port 3000')
});

为什么这个可行,而上面的不行,我该如何解决上面的问题?您建议如何解决此类问题?

最佳答案

尝试使用 app.use(cookieParser("_secret_")); 使其与 Express 具有相同的 secret

关于javascript - req.session 在 Node 中未定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37535835/

相关文章:

javascript - 制作动画 Chrome 扩展图标?

javascript - React setState() 不适用于单选字段 handleInput 方法

django - 如何在 Django 的 TestCase 中使用 session ?

java - 在车队管理应用程序中使用 node.js

node.js - 找不到 gulpfile

php - Symfony session 数组在 Controller 中工作正常但在 Twig 中不工作

mysql - 无法将变量 session 插入数据库

javascript - 如何为 javascript 文件中的文本创建语言文件?

javascript - Firefox 不处理服务器发送的事件方法

node.js - 机器人在网络聊天中工作,但在团队 channel 中不起作用