Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 为什么我会看到一个新的sess:在每个请求中输入redis?_Node.js_Redis_Connect - Fatal编程技术网

Node.js 为什么我会看到一个新的sess:在每个请求中输入redis?

Node.js 为什么我会看到一个新的sess:在每个请求中输入redis?,node.js,redis,connect,Node.js,Redis,Connect,我有一个简单的node.js服务器,将connect redis模块作为会话存储进行测试。这一切都是可行的,但我注意到我得到了一个新的sess:在每一个请求中输入redis。因为只有一个会话,所以我只需要一个键 这是我的密码: var connect = require('connect'); var util = require("util"); var RedisStore = require("connect-redis")(connect); var http = require('h

我有一个简单的node.js服务器,将connect redis模块作为会话存储进行测试。这一切都是可行的,但我注意到我得到了一个新的sess:在每一个请求中输入redis。因为只有一个会话,所以我只需要一个键

这是我的密码:

var connect = require('connect');
var util = require("util");
var RedisStore = require("connect-redis")(connect);
var http = require('http');

var app = connect()
  .use(connect.cookieParser('keyboard cat'))
  .use(connect.query())
  .use(connect.session( {
      secret:"elms",
      store:new RedisStore({prefix:'sid_'}),
      cookie:{maxAge:60000, secure:false}
    }))
  .use(function(req, res, next) {
    var sess = req.session;
    if (sess.views) {
      res.setHeader('Content-Type', 'text/html');
      res.write("<p>" + util.inspect(req.cookies) + "</p>");
      sess.basket = sess.basket || {book1:0, book2:0, book3:0};
      if(req.query.buyBook1) {sess.basket.book1 ++;}
      if(req.query.buyBook2) {sess.basket.book2 ++;}
      if(req.query.buyBook3) {sess.basket.book3 ++;}
      if(req.query.expiresession) {
        sess.cookie.maxAge = 0;
      }
      res.write('<p>views: ' + sess.views + '</p>');
      res.write('<ul>\
                  <li>book1 ' + sess.basket.book1 + ' - <a href="/?buyBook1=true">Add</a></li>\
                  <li>book2 ' + sess.basket.book2 + ' - <a href="/?buyBook2=true">Add</a></li>\
                  <li>book3 ' + sess.basket.book3 + ' - <a href="/?buyBook3=true">Add</a></li>\
                </ul>\
                <a href="/?expiresession=true">Expire session</a>');
      res.write('<p>expires in: ' + (sess.cookie.maxAge / 1000) + 's</p>');
      res.write('<p>httpOnly: ' + sess.cookie.httpOnly + '</p>');
      res.write('<p>path: ' + sess.cookie.path + '</p>');
      res.write('<p>domain: ' + sess.cookie.domain + '</p>');
      res.write('<p>secure: ' + sess.cookie.secure + '</p>');
      sess.views ++;
    } else {
      sess.views = 1;
    }

    res.write("<p>" + util.inspect(req.cookies) + "</p>");
    res.end('welcome to the session demo. refresh!');
  });
http.createServer(app).listen(3000);
var connect=require('connect');
var util=需要(“util”);
var redistore=require(“连接redis”)(连接);
var http=require('http');
var app=connect()
.use(connect.cookieParser('keyboard cat'))
.use(connect.query())
.use(connect.session({
秘密:“榆树”,
存储区:新的RedisStore({前缀:'sid_'}),
cookie:{maxAge:60000,secure:false}
}))
.使用(功能(req、res、next){
var sess=请求会话;
if(sess.视图){
res.setHeader('Content-Type','text/html');
res.write(“”+util.inspect(请求cookies)+“

”); sess.basket=sess.basket |{book1:0,book2:0,book3:0}; if(req.query.buyBook1){sess.basket.book1++;} if(req.query.buyBook2){sess.basket.book2++;} if(req.query.buyBook3){sess.basket.book3++;} if(请求查询过期会话){ sess.cookie.maxAge=0; } res.write(“视图:”+sess.views+”

); res.write('
    \
  • book1'+sess.basket.book1+'-
  • \
  • book2'+sess.basket.book2+'-
  • \
  • book3'+sess.basket.book3+'-
  • \
\ '); res.write(“在:”+(sess.cookie.maxAge/1000)+“s

”)中过期; res.write('httpOnly:'+sess.cookie.httpOnly+'

'); res.write('path:'+sess.cookie.path+'

'); res.write('domain:'+sess.cookie.domain+'

'); res.write('secure:'+sess.cookie.secure+'

'); sess.views++; }否则{ sess.views=1; } res.write(“”+util.inspect(请求cookies)+“

”); res.end('欢迎使用会话demo.refresh!'); }); http.createServer(app.listen)(3000);
我注意到req.session.cookie.domain总是空的。我在windows 8上,使用hosts文件将127.0.0.1映射到www.gaz-node.com,这就是我在服务器上看到的cookie域。可能有关联

有什么想法吗?
谢谢,答案很简单。这个星期天早上,为了调试它,我起得特别早。在我喝了第一杯咖啡的中途,答案突然变得清晰起来,这杯咖啡后来尝起来比上半杯好

对/favicon.ico请求的报复

我没有处理来自/favicon.ico浏览器的请求,这对于像我这样的节点新手来说有点困难。每个请求后面都有一个/favicon.ico请求(至少由Chrome提供),这样浏览器就可以显示站点的图标。它永远不会放弃,直到它得到一个favicon.ico

实际会话工作得非常好,只有一个会话id,但是/favicon.ico的请求没有发送任何cookie,正是这个请求触发了一个新的僵尸会话

为了解决这个问题,我添加了一个模块来处理/favicon.ico请求并提供404响应。我可以很容易地给这个无情的浏览器一个favicon,然后用“fs”模块发送它

在使用会话模块之前,处理/favicon.ico并结束响应,而不调用next(),这一点很重要!以下是固定代码:

var connect = require('connect');
var util = require("util");
var RedisStore = require("connect-redis")(connect);
var http = require('http');

var app = connect()
  .use(function(req, res, next) {
    if(req.url == '/favicon.ico') {
      serve404(res);
    } else {
      next();
    } 
  })
  .use(connect.cookieParser())//"elms123"))
  .use(connect.query())
  .use(connect.session( {
      secret:"elms123",
      store:new RedisStore({prefix:'sid_'}),
      cookie:{maxAge:60000, secure:false, domain:"gaz-node.com"}
    }))
  .use(function(req, res, next) {
    var sess = req.session;
    res.setHeader('Content-Type', 'text/html');
    res.write('welcome to the session demo. refresh!');
    if (sess.views) {

      res.write("<p>" + util.inspect(req.cookies) + "</p>");
      sess.basket = sess.basket || {book1:0, book2:0, book3:0};
      if(req.query.buyBook1) {sess.basket.book1 ++;}
      if(req.query.buyBook2) {sess.basket.book2 ++;}
      if(req.query.buyBook3) {sess.basket.book3 ++;}
      if(req.query.expiresession) {sess.cookie.maxAge=0;}
      if(req.query.forceerror) {/*idontexist()*/throw new Error('ahhhh!');}

      res.write('<p>views: ' + sess.views + '</p>');
      res.write('<ul>\
                  <li>book1 ' + sess.basket.book1 + ' - <a href="/?buyBook1=true">Add</a></li>\
                  <li>book2 ' + sess.basket.book2 + ' - <a href="/?buyBook2=true">Add</a></li>\
                  <li>book3 ' + sess.basket.book3 + ' - <a href="/?buyBook3=true">Add</a></li>\
                </ul>\
                <a href="/?expiresession=true">Expire session</a>\
                <a href="/?forceerror=true">Force error</a>');
      res.write('<p>expires in: ' + (sess.cookie.maxAge / 1000) + 's</p>');
      res.write('<p>httpOnly: ' + sess.cookie.httpOnly + '</p>');
      res.write('<p>path: ' + sess.cookie.path + '</p>');
      res.write('<p>domain: ' + sess.cookie.domain + '</p>');
      res.write('<p>secure: ' + sess.cookie.secure + '</p>');
      sess.views ++;
    } else {
      sess.views = 1;
    }

    res.end("<p>" + util.inspect(req.cookies) + "</p>");
  })
  .use(connect.errorHandler());
http.createServer(app).listen(3000);

function serve404(res) {
  res.writeHead(404, {"content-type": "text/plain"});
  res.end("Error : Resource not found");
}
var connect=require('connect');
var util=需要(“util”);
var redistore=require(“连接redis”)(连接);
var http=require('http');
var app=connect()
.使用(功能(req、res、next){
如果(req.url='/favicon.ico'){
serve404(res);
}否则{
next();
} 
})
.use(connect.cookieParser())/“elms123”))
.use(connect.query())
.use(connect.session({
秘密:“elms123”,
存储区:新的RedisStore({前缀:'sid_'}),
cookie:{maxAge:60000,secure:false,域:“gaz node.com”}
}))
.使用(功能(req、res、next){
var sess=请求会话;
res.setHeader('Content-Type','text/html');
res.write('欢迎使用会话demo.refresh!');
if(sess.视图){
res.write(“”+util.inspect(请求cookies)+“

”); sess.basket=sess.basket |{book1:0,book2:0,book3:0}; if(req.query.buyBook1){sess.basket.book1++;} if(req.query.buyBook2){sess.basket.book2++;} if(req.query.buyBook3){sess.basket.book3++;} if(req.query.expiresession){sess.cookie.maxAge=0;} if(req.query.forceerror){/*idontexist()*/抛出新错误('ahhhh!');} res.write(“视图:”+sess.views+”

); res.write('
    \
  • book1'+sess.basket.book1+'-
  • \
  • book2'+sess.basket.book2+'-
  • \
  • book3'+sess.basket.book3+'-
  • \
\ \ '); res.write(“在:”+(sess.cookie.maxAge/1000)+“s

”)中过期; res.write('httpOnly:'+sess.cookie.httpOnly+'

'); res.write('path:'+sess.cookie.path+'

'); res.write('domain:'+sess.cookie.domain+'

'); res.write('secure:'+sess.cookie.secure+'

'); sess.views++; }否则{ sess.views=1; } res.end(“”+util.inspect(请求cookies)+“

”); }) .use(connect.errorHandler()); http.createServer(app.listen)(3000); 功能serve404(res){ res.writeHead(404,{“内容类型”:“text/plain”}); res.end(“错误:未找到资源”); }
我也有这个问题。当然,我们应该使用“favicon”中间件。并确保将“会话”中间件置于“静态”之下。查看我的答案

您可以轻松检查会话是否在客户端创建。应该设置一个名为connect.sid的仅http cookie,如果不设置,则可能是cookie域有问题。Chrome开发工具>资源>Cookies ca