【问题标题】:I don't know what I am doing wrong setting the cookie?我不知道我做错了什么设置cookie?
【发布时间】:2013-07-07 06:14:04
【问题描述】:

所以我正在使用 nodejs 和 mongodb 并尝试在其中一个页面上设置 cookie。

在 app.js 文件中,使用这个非常标准

var express = require('express')
  , app = express()
  , dbUserModel = require('./models/user')
  , db = require('./db')
  , pass = require('./config/passport')
  , passport = require('passport')
  , routes = require('./routes/index')
  , user = require('./routes/user')
  , path = require('path')
  , http = require('http')
  , connect = require('connect')
  , mongoose = require('mongoose')
  , mongoConnect = mongoose.connect('mongodb://localhost/test5');

// all environments

app.configure(function(){
    app.set('port', process.env.PORT || 3000);
    app.set('views', __dirname + '/views');
    app.set('view engine', 'jade');


    app.use(express.favicon());
    app.use(express.logger('dev'));
    app.use(express.bodyParser());
  app.use(express.cookieParser('secret'));
  ///app.use(express.cookieSession());
  app.use(express.methodOverride());
    app.use(passport.initialize());
    app.use(passport.session());
    app.use(app.router);
    app.use(express.static(path.join(__dirname, 'public')));    
});
  app.get('/', routes.index)
  app.get('/register', user.register);
  app.post('/register', user.registerPost);
  app.get('/registerError', user.registerError);
  app.get('/registerThanks', user.registerThanks);
  app.get('/login', user.login);
  app.post('/login', user.loginPost);
  app.get('/loginError', user.loginError);
  app.get('/userProfile', user.userProfile);

http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
  console.log('Users: ' + db.collections.users);
});

然后我调用我的路由文件。

这是我的代码:

exports.login = function(req, res) {
    res.render('login', {user: req.user, title: 'Weblio'});
};

exports.loginPost = function(req, res, next) {
    passport.authenticate('local', function(err, user, info) {
        if (err) { return next(err) }
        if (!user) { return res.redirect('loginError'); }
        req.logIn(user, function(err) {
            if (err) { return next(err); }
            return res.redirect('userProfile');
        });
  })(req, res, next);
};

exports.loginError = function (req, res) {
    res.render('loginError', {title: 'Weblio'});
};

exports.userProfile = function(req, res) {      
    res.render('userProfile', {user: req.user, title: 'Weblio'});
    res.cookie('name', 'test', { maxAge: 900000, httpOnly: true }); 

};

当我转到 userProfile 页面并在控制台中输入 document.cookie 时,它​​会显示一个空字符串作为结果。

我还尝试将 res.cookie 移动到登录帖子中,但它不起作用...

请帮忙!

【问题讨论】:

    标签: node.js cookies


    【解决方案1】:

    无论您使用何种编程语言,在将响应标头发送到客户端后,您都无法修改 cookie。当调用res.render() 时,它会发送标题和实际视图。

    HTTP cookie 是发送给客户端的标头的一部分。

    尝试在将响应发送给客户端的res.render() 之前调用res.cookie()

    此外,当调用 app.use(express.cookieParser('secret')); 时,您正在通过提供“秘密”参数创建一个“签名”cookie。
    因此,在更改 cookie 时,您必须告诉 express 您正在处理这样的签名 cookie:
    res.cookie('name', 'test', {maxAge: 900000, httpOnly: true, signed: true});

    您可以在此处阅读有关 cookie 的更多信息:http://www.nczonline.net/blog/2009/05/05/http-cookies-explained/

    【讨论】:

    • 当我将它的位置更改为渲染前时,cookie 似乎仍然留下一个空字符串。
    • 它应该可以工作 - 我猜你有别的东西在困扰你。编辑您的问题以使用其他路线删除不必要的代码,然后向我展示 app.js 文件...
    • 我应该运行 app.use(express.cookieSession());在 cookieParser 之后,我在上面的代码中将其注释掉了。另外,如果我仍然在控制台中执行 document.cookie。 cookie 仍然是一个空字符串。
    • 我不认为cookieSession() 应该是一个问题,尽管我不是 100% 确定这一点。无论如何,在渲染调用之前设置 cookie 并告诉 cookie 它已签名后,它应该可以工作。我已经做了好几次了。我现在唯一能想到的是,您正在使用的 passport 模块正在干扰 cookie,可能是通过在您之前设置响应标头...我会尝试删除具有 app.use(passport....) 的行只是为了检查它是否解决了问题。
    猜你喜欢
    • 2014-02-16
    • 2021-01-05
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    相关资源
    最近更新 更多