【问题标题】:express, creating cookie with jsonexpress,用json创建cookie
【发布时间】:2022-03-02 15:19:48
【问题描述】:

我正在使用 express 3.x 并尝试创建一个 cookie。

我正在尝试关注 json:

res.cookie('cart', {
                styles: styles[product],
                count: 0,
                total: 0
            }) 

产品在哪里:

{product: {
       "_id": style._id,
       "style": style.style,
       "a": style.a,
       "color": color,
       "price": style.price,
       "desc": style.desc,
       "img": style.img,
       "category": style.category,
       "quantity": 1
        }

}

var product = req.params.a + "_" + style.id;

我无法让 'styles[product]' 工作。我有什么问题??

我需要创建一个类似于 'req.cookies.cart.styles[product]' 的 json

请帮忙!

【问题讨论】:

    标签: javascript json node.js cookies express


    【解决方案1】:

    您只能在 cookie 中存储字符串值。假设您想在 cookie 中存储一个布尔值 true,它被转换为字符串“true”并存储在浏览器 cookie 中。以下代码将执行相同的操作

    res.cookie('myBoolean', true)
    

    现在布尔值 true 存储为 cookie 中的字符串“true”。

    在您的情况下,您尝试将对象存储在 cookie 中。所以在内部你的对象通过调用如下函数转换为字符串

    var myObj = {name: 'myObj'}
    myObj.toString()
    

    正是在您的代码中,cookie 包含值

    res.cookie('cart', ({
                    styles: styles[product],
                    count: 0,
                    total: 0
                }).toString())
    

    你可以查看浏览器,你可以看到cookie如下

    cart:[object Object]
    

    所以更好的主意是,你必须使用 JSON.stringify/JSON.parse 如下

    设置 Cookie:

    res.cookie('cart', JSON.stringify({ 样式:样式[产品], 计数:0, 总计:0 }))

    获取 Cookie

    var cookieData = JSON.parse(req.cookies.cart)
    

    注意: 但是您可以使用 JSON.stringify 存储 cookie,不建议存储这样的购物车信息。您必须更喜欢会话存储而不是 cookie。

    【讨论】:

    • 感谢您的回答。我不知道 cookie 只存储一个字符串。我尝试了会话,但它吃掉了太多的记忆,因此 chrome 在购物车中存储了八种样式,而 Internet Explorer 存储了十种样式..所以我正在探索替代方案
    • @wisleans,您可以将会话存储在内存缓存或数据库中。当您运行具有负载平衡的节点应用程序时,这是非常乐观的解决方案。 connect-memcached、connect-mongo、session-mongoose 模块等等。您可以尝试其中任何一种。
    • 你更喜欢哪个模块? connect-memcached 似乎很复杂.. connect-mongo 给我一个错误说套接字挂断。
    • @wisleans,我在我的一个作品中使用了 session-mongoose。这是一个强大的会话管理模块,带有 mongoDB 的副本集。你可以试试这个
    【解决方案2】:

    目前还不清楚你想要实现什么。如果product 真的是对象,那么它几乎不能用作键——它将被转换为[object Object] 字符串,styles[product] 将等于styles['[object Object]']

    如果styles[product] 返回的产品类似于第二个代码块中的产品,那么style.id 可能应该是style.product._id

    我可以建议的最好方法是通过添加console.log 检查所有中间步骤。例如:

    console.log('keys of styles:', Object.keys(styles));
    console.log('product:', product);
    res.cookie('cart', {
        styles: styles[product],
        count: 0,
        total: 0
    })
    

    这将向您显示确切添加到 cookie 中的内容。使用类似的方法来测试算法的其他部分。

    【讨论】:

      【解决方案3】:

      Cookie 通常以这种格式传输:

      "var1=value1;var2=value2;"
      

      而不是

      {"var1": "value1"; "var2": "value2"}
      

      我有一个类似的问题 - 我需要将 JSON 对象转换为 cookie,我能够通过将此对象转换为字符串,然后替换一些关键语法元素来解决它:

      var req_options = {
          headers: {
              // ...
              'Cookie': JSON.stringify(
                  {"var1": "value", "var2": "value2"}
                  ).replace(":", "=").replace(/\{|\}|\"/g, "").replace(",", ";")
          }
      };
      

      就我而言,工作代码的完整版本如下所示:

      const request = require('request');
      
      var req_options = {
          uri: '...',
          headers: {
              //'Accept': 'text/html', 'Accept-Charset': 'utf-8', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
              'Cookie': JSON.stringify(
                  {"var1": "value", "var2": "value2"}
                  ).replace(":", "=").replace(/\{|\}|\"/g, "").replace(",", ";")
          }
      };
      
      function doRequest() {
          return new Promise((resolve, reject) => {
              process.stdout.write("Calling for " + req_options.uri + "... ");
              request(req_options, function (error, res, body) {
                  if (res.statusCode === 200) {
                      console.log("200 OK, answer:\n", JSON.parse(body)); //resolve("200 OK");
                  }
                  if (error)
                      return reject(error);
              });
          });
      }
      
      async function mainLoop() {
          console.clear();
          console.log("Hi");
          console.log("headers.cookie: \"" + req_options.headers.Cookie + "\"");
          await doRequest().then(function(val) {
              console.log(val);
          }).catch(function(err) {
              console.error(err);
          });
          console.log("Bye");
      }
      
      mainLoop();
      

      在你的情况下,它可能看起来像这样:

      res.cookie('cart',
          JSON.stringify({
              styles: styles[product],
              count: 0,
              total: 0
          }).replace(":", "=").replace(/\{|\}|\"/g, "").replace(",", ";")
      

      【讨论】:

        猜你喜欢
        • 2021-02-04
        • 2020-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多