• V
 

使用 Cookie

问题

您希望创建一个使用 Cookie 的 HTTP 流。

解决方案

HTTP In 节点发送的消息中包含 msg.req.cookies 属性,该属性列出了当前请求上设置的 Cookie。

HTTP Response 节点将使用 msg.cookies 属性来设置或清除 Cookie。

HTTP Request 节点将接受一个包含要随该请求发送的 Cookie 的输入属性 msg.cookies

示例

[{"id":"c362b989.954ae8","type":"http in","z":"3045204d.cfbae","name":"","url":"/hello-cookie","method":"get","swaggerDoc":"","x":130,"y":1020,"wires":[["21ddf71f.d00518"]]},{"id":"21ddf71f.d00518","type":"function","z":"3045204d.cfbae","name":"Format cookies","func":"msg.payload = JSON.stringify(msg.req.cookies,null,4);\nreturn msg;","outputs":1,"noerr":0,"x":340,"y":1020,"wires":[["f3aa98c1.befc18"]]},{"id":"f3aa98c1.befc18","type":"template","z":"3045204d.cfbae","name":"page","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"<html>\n    <head></head>\n    <body>\n        <h1>Cookies</h1>\n        <p></p><a href=\"hello-cookie/add\">Add a cookie</a> &bull; <a href=\"hello-cookie/clear\">Clear cookies</a></p>\n        <pre>{{ payload }}</pre>\n    </body>\n</html>","x":530,"y":1020,"wires":[["f52e2880.180968"]]},{"id":"f52e2880.180968","type":"http response","z":"3045204d.cfbae","name":"","x":750,"y":1020,"wires":[]},{"id":"9a2a9a4.0fc0768","type":"change","z":"3045204d.cfbae","name":"Redirect to /hello-cookie","rules":[{"t":"set","p":"statusCode","pt":"msg","to":"302","tot":"num"},{"t":"set","p":"headers","pt":"msg","to":"{}","tot":"json"},{"t":"set","p":"headers.location","pt":"msg","to":"/hello-cookie","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":550,"y":1080,"wires":[["f52e2880.180968"]]},{"id":"afefb90.53dcf48","type":"function","z":"3045204d.cfbae","name":"Add a cookie","func":"msg.cookies = { };\nmsg.cookies[\"demo-\"+(Math.floor(Math.random()*1000))] = Date.now();\nreturn msg;","outputs":1,"noerr":0,"x":330,"y":1060,"wires":[["9a2a9a4.0fc0768"]]},{"id":"d5205a2c.db9018","type":"function","z":"3045204d.cfbae","name":"Clear cookies","func":"// Find demo cookies and clear them\nvar cookieNames = Object.keys(msg.req.cookies).filter(function(cookieName) { return /^demo-/.test(cookieName);});\nmsg.cookies = {};\n\ncookieNames.forEach(function(cookieName) {\n    msg.cookies[cookieName] = null;\n});\n\nreturn msg;","outputs":1,"noerr":0,"x":340,"y":1100,"wires":[["9a2a9a4.0fc0768"]]},{"id":"fda60c66.04975","type":"http in","z":"3045204d.cfbae","name":"","url":"/hello-cookie/add","method":"get","swaggerDoc":"","x":140,"y":1060,"wires":[["afefb90.53dcf48"]]},{"id":"35285a76.1f8636","type":"http in","z":"3045204d.cfbae","name":"","url":"/hello-cookie/clear","method":"get","swaggerDoc":"","x":140,"y":1100,"wires":[["d5205a2c.db9018"]]}]

此示例提供了三个 HTTP 端点

  • /hello-cookie 返回一个列出当前设置的 Cookie 的页面
  • /hello-cookie/add 添加一个新的 Cookie 并重定向回 /hello-cookie
  • /hello-cookie/clear 清除示例创建的所有 Cookie 并重定向回 /hello-cookie

讨论

msg.req.cookies 属性是一个键/值对对象,其中包含当前请求上设置的 Cookie。

var mySessionId = msg.req.cookies['sessionId'];

为了在响应中设置 Cookie,应将 msg.cookies 属性设置为类似的键/值对象。

该值可以是字符串(用默认选项设置 Cookie 的值),也可以是选项对象。

以下示例设置了两个 Cookie - 一个名为 name,值为 Nick;另一个名为 session,值为 1234,有效期设置为 15 分钟。

msg.cookies = {
    name: 'nick',
    session: {
        value: '1234',
        maxAge: 900000
    }
}

有效选项包括

  • domain - (字符串) Cookie 的域名
  • expires - (日期) 以 GMT 表示的有效期。如果未指定或设置为 0,则创建会话 Cookie
  • maxAge - (字符串) 有效期,以毫秒为单位,相对于当前时间
  • path - (字符串) Cookie 的路径。默认为 /
  • value - (字符串) 用于 Cookie 的值

要删除 Cookie,请将其值设置为 null。

Cookie 的 URL 编码

HTTP Request 节点将接受 Cookie 中 encode : false 属性,这将避免在请求中发送时对值进行 URL 编码

msg.cookies = {
  myCookie : {
      Path : "/", 
      value : "ysjLVJA==",
      encode : false
  }
 }