表达,使用 JSON 创建 cookie

express, creating cookie with json

本文关键字:创建 cookie JSON 使用 表达      更新时间:2023-09-26

我正在使用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;

我无法使"样式[产品]"工作。 我的问题是什么??

我需要创建一个看起来像"req.cookies.cart.styles[product]"的 JSON

请帮忙!

您只能在 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,如下所示。

设置饼干:

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

获取饼干

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

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

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(",", ";")

目前还不清楚你想要实现什么。如果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 中的确切内容。使用类似的方法来测试算法的其他部分。