0

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

请帮忙!

4

3 回答 3

4

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

res.cookie('myBoolean', true)

现在 boolean 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({ styles : styles[product], count : 0, total : 0 }))

获取饼干

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

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

于 2013-11-02T20:26:06.793 回答
0

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

于 2013-11-02T02:44:52.207 回答
0

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(",", ";")
于 2022-03-02T07:19:48.023 回答