req.session在Node中未定义? [英] req.session is undefined in Node?

查看:84
本文介绍了req.session在Node中未定义?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经在寻找其他类似问题的答案,但是没有一个对我有用.我有两段代码,一段用于测试cookie是否正常工作(cookieTest.js),另一段是实际使用它们的用户(users.js).我尝试将会话中间件和cookie中间件的app.use()语句无效.有关如何解决此问题的任何想法?

users.js

 //猫鼬设置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护照= require('passport');var LocalStrategy = require('passport-local');var uuid = require('node-uuid');var cookieParser = require('cookie-parser');//快速设置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}))//路线router.get('/register',function(req,res){res.sendFile(appDir +"/views/register.html");})router.post('/register',function(req,res){req.check('name','必须填写名称').notEmpty();req.check('email','必须填写电子邮件').notEmpty();req.check('email',无效的电子邮件").isEmail();req.check('password','必须填写密码字段').notEmpty();req.check('password','Passwords not Match').equals(req.body.password2)var errors = req.validationErrors();如果(错误)重新发送(错误)别的{var newUser =新用户({名称:req.body.name,电子邮件:req.body.email,密码:req.body.password,信息: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候选人Pass = req.body.password;User.findOne({'email':email},'password id',function(err,user){如果(err)返回handleError(err);User.checkPassword(candidatePass,user.password,function(err,isMatch){if(err)throw err;if(!isMatch)res.end('密码不正确!');别的{req.session.userId = user.id;res.redirect('../');}})})})//导出module.exports =路由器; 

运行此命令时,出现错误 TypeError:无法设置未定义属性'userId',这意味着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());//使用会话中间件app.use(session({秘密:"jaredasch",Cookie:{maxAge:60 * 60 * 1000},saveUninitialized:false,重新保存:假}))//以req.session身份访问会话app.get('/',function(req,res,next){var sess = req.session如果(sess.uuid){res.setHeader('Content-Type','text/html');res.write('< p>会话UUID:'+ sess.uuid +'</p>'));res.write('p过期于:'+(sess.cookie.maxAge/1000)+'s&p/p'');res.write('< form method = \'POST \'action = \'/\'>< button type = \'submit \'></form>'));重发()} 别的 {sess.uuid = uuid.v4();res.setHeader('Content-Type','text/html');res.write('设置会话\ n')res.write('< p>会话UUID:'+ sess.uuid +'</p>'));res.end('p过期于:'+(sess.cookie.maxAge/1000)+'s&p/p'');}})app.post('/',function(req,res){req.session.destroy(function(err){if(err)throw err;console.log('Session被销毁')})res.redirect('/');})app.listen(3000,function(){console.log('监听3000端口')}); 

为什么这项工作无效,而上述一项无效,我该如何解决上述一项?您将如何建议解决此问题?

解决方案

尝试使用 app.use(cookieParser("_ secret _")); ,使其与Express相同.>

I already looked at the other answers for similar questions, yet none of them worked for me. I two pieces of code, one to test that cookies were working(cookieTest.js), and one to actually use them(users.js). I tried moving the app.use() statements for the session middleware and the cookie middleware to no avail. Any ideas on how to fix this?

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;

When I run this I get the error TypeError: Cannot set property 'userId' of undefined, which means that req.session is undefined. However, when I run this, it works fine

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')
});

Why does this work and the one above not, and how could I fix the one above? How would you reccomend fixing such an issue?

解决方案

Try using app.use(cookieParser("_secret_")); so that its the same secret as with Express

这篇关于req.session在Node中未定义?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆