Javascript req.session仅在AJAX中未定义
所以,我已经挣扎了几个小时了。当我使用AJAX将内容发布到服务器时,会话不会被发送到服务器,但是如果没有AJAX,它可以很好地工作,比如单击链接、注销等,这让我非常沮丧。总之,以下是我的代码:Javascript req.session仅在AJAX中未定义,javascript,jquery,ajax,node.js,express,Javascript,Jquery,Ajax,Node.js,Express,所以,我已经挣扎了几个小时了。当我使用AJAX将内容发布到服务器时,会话不会被发送到服务器,但是如果没有AJAX,它可以很好地工作,比如单击链接、注销等,这让我非常沮丧。总之,以下是我的代码: var express = require('express'), // express 4 mongoskin = require('mongoskin'), Busboy = require('busboy'), cookieParser = require('cookie-parser'), ses
var express = require('express'), // express 4
mongoskin = require('mongoskin'),
Busboy = require('busboy'),
cookieParser = require('cookie-parser'),
session = require('express-session'),
mailer = require('nodemailer'),
compress = require('compression'),
morgan = require('morgan'),
ect = require('ect'),
suspend = require('suspend'),
MongoStore = require('connect-mongo')(session);
app.use(compress());
app.engine('.ect', renderer.render);
app.set('env', 'development');
app.use(express.static(__dirname + '/public'));
app.use(cookieParser());
app.use('/admin', session({
secret : 'qlauwork secret yo',
name : 'qlauworks.sess',
proxy : true,
rolling : true,
cookie : {
maxAge : 1000 * 60 * 60 * 6
},
store : new MongoStore({
db : 'qlauworks',
auto_reconnect : true,
defaultExpirationTime : 1000 * 60 * 60 * 6
}),
unset : 'destroy'
}));
// ... etc etc
app.post('/admin/login', function (req, res) {
var msg = {};
var busboy = new Busboy({ headers : req.headers });
busboy.on('field', function (fieldName, val) {
msg[fieldName] = val;
});
busboy.on('finish', function () {
suspend.run(function * () {
msg.password = crypto.createHash('whirlpool').update(SALT).update(msg.password).digest('hex');
var user = yield db.users.findOne({ username : msg.username, password : msg.password }, suspend.resume());
if (!user) {
return res.json({ error : 'Wrong username or password' });
}
// create session token
var token = yield crypto.randomBytes(32, suspend.resume());
token = token.toString('hex');
yield db.users.update({ username : msg.username }, { $set : { token : token } }, { upsert : true }, suspend.resume());
req.session.token = token;
res.redirect('/admin/forms');
}, function (err) {
if (err) {
console.log('login: ', err);
res.send('Server error');
}
});
});
req.pipe(busboy);
});
// this is the logout and forms, works just fine
app.get('/admin/logout', auth, function (req, res) {
suspend.run(function * () {
var token = req.session.token;
yield db.users.update({ token : token }, { $unset : { token : true } }, suspend.resume());
delete req.session.token;
req.session.destroy(function (err) {
if (!err) {
res.clearCookie('qlauworks.sess', { path : '/' });
res.redirect('/admin');
}
});
}, function (err) {
if (err) {
console.log('logout: ', err);
res.json({ error : 'Server error' });
}
});
});
app.get('/admin/forms', auth, function (req, res) {
res.send(formPage);
});
// and this is the auth middleware, could logout and moving around the admin page
// but req.session always undefined if comes from an AJAX request
function auth (req, res, next) {
suspend.run(function * () {
console.log(req.session);
console.log('=====================================================')
if (!req.session.token) {
return res.json({ error : 'Invalid token' });
}
var user = yield db.users.findOne({ token : req.session.token }, suspend.resume());
if (!user.username) {
return res.json({ error : 'Invalid token' });
}
next();
}, function (err) {
if (err) {
console.log('auth: ', err);
res.json({ error : 'Server error' });
}
});
}
这是客户端
$.post('/api/item/new', elem, function (rep) {
thisForm.find('input[type="submit"]').attr('disabled', false);
if (rep.error) {
$('#alert-multi').removeClass('success').addClass('alert').text(rep.error);
} else {
$('#alert-multi').removeClass('alert').addClass('success').text('Success');
$('input[type="reset"]').click();
for (var i = 0; i < len; i++) {
$('#preview-multi' + i).attr('src', '');
$('#multi' + i).attr('data-image-src', '');
}
}
});
$.post('/api/item/new',元素,函数(rep){
thisForm.find('input[type=“submit”]).attr('disabled',false);
如果(代表错误){
$('#alert multi').removeClass('success').addClass('alert').text(rep.error);
}否则{
$('#alert multi').removeClass('alert').addClass('success').text('success');
$('input[type=“reset”]”)。单击();
对于(变量i=0;i
那么,我该如何解决这个问题呢?看起来您在
/admin
上安装了会话中间件,但您试图调用/api/item/view
这与使用express不一样。use(path,middleware)
将仅对req.url
包含path
的请求调用middleware
在
/
上装载会话中间件(不使用路径
参数-simpleexpress.use(middleware)
即可),或者更改ajax url以/admin
开头(可能不是您想要做的事情).服务器端代码中/api/item/view
的映射在哪里?@soulcheck它是这样的app.post('/api/item/:whatdo',auth,function(req,res){
请发布整个映射,因为这很有趣part@soulcheck我不知道这是否重要,因为它甚至不会通过授权检查,但我会发布它,在我把它放在pastebin上之前稍等。是的,这毕竟不重要-看我的答案…天哪,我真的太感谢你了。你让我看起来也像个傻瓜我和我现在都很喜欢。我只是浪费了大约6个小时来解决这个问题。非常感谢你,先生。很高兴能提供任何帮助。有时,让另一双眼睛看代码比自己花几个小时看代码更有用:)我身上发生了很多次。没错。现在我必须帮助别人报答:)