Set-Cookie添加2个Cookie

时间:2018-11-06 14:31:56

标签: javascript node.js cookies

我有这个课:

var qs = require('querystring');

class Cookie
{
    constructor(req, res)
    {
        this.req = req;
        this.res = res;
    }

    get(name)
    {
        if (this.has(name))
        {
            var cookies = qs.parse(this.req.headers.cookie, '; ', '=');

            return cookies[name];
        }

        return null;
    }
    set(name, value)
    {
        this.res.setHeader('Set-Cookie', `${name}=${value};`)
    }

    delete(name)
    {
        if (this.has(name)) 
        {
            this.set(name, '')
        }
    }

    has(name)
    {
        if (typeof this.req.headers.cookie !== 'undefined') 
        {
            const cookies = qs.parse(this.req.headers.cookie, '; ', '=')

            return typeof cookies[name] !== 'undefined';
        }

        return false;
    }
}

然后我尝试一下:

const http = require('http');

http.createServer((req, res) => {
  const cookie = new Cookie(req, res);
  
  cookie.set('name', 'Nikita')
  cookie.set('age', '13')
  
  res.setHeader('Content-Type', 'text/plain');
  res.write('Now you have cookies')
  res.end()
  
}).listen(8000)

然后我在“编辑此Cookie”中查找,仅看到最后一个cookie(年龄= 13)

我认为这是因为响应中有一个变量,其中存储cookie,并且当我使用Set-Cookie时,它会设置该变量的值,但是如何获得之前添加的变量?

1 个答案:

答案 0 :(得分:1)

只能有一个Set-Cookie标头,并且每次调用cookie.set时都将覆盖其值。

正确的方法是在类中保留一个本地字符串变量,并在每次调用name=value时将新的cookie.set对附加到该变量上

class Cookie
{
    var cookieString = ""

    // ...

    set(name, value)
    {  
        if (cookieString) 
        { 
            cookieString += '; '
        }

        cookieString += `${name}=${value}`
        this.res.setHeader('Set-Cookie', cookieString)
    }

    //...
}