在服务之前操纵Cookies

时间:2015-11-28 06:12:09

标签: javascript node.js cookies express

方案

我有一个使用Express框架的简单NodeJS服务器。我有一些我需要服务的ReactJS页面。现在没有同构。

在投放之前,我想检查用户是否有特定的cookie,然后根据我想要创建新的cookie。

我尝试了什么

以下是我的server.js文件的代码。

var express = require("express");
var app = express();
var Cookies = require("cookies");

app.use(function(req, res){
  var cookies = new Cookies( req, res);
  var userCookie = cookies.get("sso");
  var isLoggedIn = cookies.get("isLoggedIn");

  if(userCookie !== undefined && isLoggedIn === false){
    cookies.set("isLoggedIn", true);
  }
});


app.use(express.static(__dirname + '/build'));

var port = process.env.PORT || 8080;
app.listen(port, function() {
  console.log("Listening on " + port);
});

所以我使用express.static来提供build文件夹中的静态文件。

我尝试将app.use(express.static(__dirname + '/build'));行移到上一个app.use之上,但代码永远不会进入Cookie部分。

我尝试过这个简单的事情。即使这样也没有用。我可以看到日志hello,但网站没有工作。

var express = require("express");
var app = express();

app.use(function(req, res){
  console.log("hello");
});

app.use(express.static(__dirname + '/build'));

var port = process.env.PORT || 8080;
app.listen(port, function() {
  console.log("Listening on " + port);
});

2 个答案:

答案 0 :(得分:2)

您使用Cookie时出现问题。您正在检查isLoggedIn,Cookie值=== false是否为布尔值。但Cookie始终是字符串,因此比较始终为false,您永远不会将isLoggedIn设置为"true"

如果您更新代码以将值视为字符串,则可能会有效。尝试这样的事情:

if(userCookie !== undefined && isLoggedIn !== "true"){
  cookies.set("isLoggedIn", "true");
}

答案 1 :(得分:1)

正如杰里米的回答所指出的那样,我错误地使用了这些饼干。但这不是核心问题。如果代码已运行,则表达服务器会抛出错误。真正的问题是我没有在应用程序的请求 - 响应周期中调用下一个中间件。根据{{​​3}}

  

中间件是一个可以访问请求对象(req)的函数   响应对象(res),以及应用程序中的下一个中间件   请求 - 响应周期,通常由名为next的变量表示。

我没有打电话给next

所以更新的运行代码是:

var express = require("express");
var app = express();
var Cookies = require("cookies");

app.use(function(req, res, next){
  var cookies = new Cookies( req, res);
  var userCookie = cookies.get("sso");
  var isLoggedIn = cookies.get("isLoggedIn");

  if(userCookie !== undefined && isLoggedIn !== "true"){
    cookies.set("isLoggedIn", "true",{ httpOnly: false } );
  }
  next();
});

app.use(express.static(__dirname + '/build'));

var port = process.env.PORT || 8142;
app.listen(port, function() {
  console.log("Listening on " + port);
});
相关问题