• V
 

使用 cookies

问题

您想要创建一个使用 cookies 的 HTTP 流。

解决方案

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

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

HTTP Request 节点将接受一个包含要随该请求发送的 cookies 的 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":"格式化 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":"页面","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\">添加一个 cookie</a> &bull; <a href=\"hello-cookie/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":"重定向到 /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":"添加一个 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":"清除 cookies","func":"// 找到 demo cookies 并清除它们\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 返回一个列出当前设置的 cookies 的页面
  • /hello-cookie/add 添加一个新 cookie 并重定向回 /hello-cookie
  • /hello-cookie/clear 清除示例创建的所有 cookies 并重定向回 /hello-cookie

讨论

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

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

为了在响应中设置一个 cookie,msg.cookies 属性应该设置为类似的键/值对象。

值可以是一个字符串,用于设置默认选项下的 cookie 值,或者可以是一个选项对象。

以下示例设置了两个 cookies - 一个名为 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。

Cookies 的 URL 编码

HTTP Request 节点将接受一个 encode : false 的属性,该属性会确保值在请求中发送时不会被 URL 编码。

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