Javascript 节点中未定义req.session?
我已经看过了其他类似问题的答案,但没有一个对我有用。我编写了两段代码,一段用于测试cookies是否正常工作(cookieTest.js),另一段用于实际使用它们(users.js)。我尝试移动会话中间件和cookie中间件的app.use()语句,但没有成功。有没有办法解决这个问题 users.jsJavascript 节点中未定义req.session?,javascript,node.js,session,express,session-cookies,Javascript,Node.js,Session,Express,Session Cookies,我已经看过了其他类似问题的答案,但没有一个对我有用。我编写了两段代码,一段用于测试cookies是否正常工作(cookieTest.js),另一段用于实际使用它们(users.js)。我尝试移动会话中间件和cookie中间件的app.use()语句,但没有成功。有没有办法解决这个问题 users.js //Mongoose Setup var mongoose = require('mongoose'); var Schema = mongoose.Schema; mongoose.connec
//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:cannotsetproperty'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')
});
var express=require('express');
var会话=需要(“快速会话”);
var-app=express();
var uuid=require('node-uuid');
var bodyParser=require('body-parser');
use(bodyParser.urlencoded({extended:false}));
use(bodyParser.json());
//使用会话中间件
应用程序使用(会话)({
秘密:“jaredasch”,
cookie:{maxAge:60*60*1000},
saveUninitialized:false,
转存:错
}))
//以req.session的形式访问会话
app.get('/',函数(req,res,next){
var sess=req.session
如果(sess.uuid){
res.setHeader('Content-Type','text/html');
res.write(“会话UUID:”+sess.UUID+”);
res.write(“在:”+(sess.cookie.maxAge/1000)+“s”)中过期;
res.write(“”);
决议结束()
}否则{
sess.uuid=uuid.v4();
res.setHeader('Content-Type','text/html');
res.write('设置会话\n')
res.write(“会话UUID:”+sess.UUID+”);
res.end(“在以下时间到期:”+(sess.cookie.maxAge/1000)+“s”;
}
})
app.post(“/”,函数(请求,res){
请求会话销毁(功能(错误){
如果(错误)抛出错误;
console.log('会话已销毁')
})
res.redirect('/');
})
app.listen(3000,函数(){
console.log('在端口3000上侦听')
});
为什么这项工作和上面的一个不工作,我如何才能修复上面的一个?您建议如何解决此类问题?尝试使用app.use(cookieParser(“\u secret”)编码>使其与Express相同的秘密尝试使用app.use(cookieParser(“\u secret”)
这样它的秘密就和Express一样了