请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

Invalid character in header content [“Set-Cookie”]

我的router/user.js里面代码:

   if(method === 'GET' &&path === '/api/user/login'){
        const {username, password} = req.query
        console.log(username)
        const reslut = login(username, password)
        return reslut.then((obj)=>{
            console.log(obj)
            if(obj.username){
                //操作cookie,给用户写入cookie  (path改为 根目录,所有的路由都会生效)
                res.setHeader('Set-Cookie', `username=${obj.username};path=/`);
                return new SuccessModel('登录成功')
            } else{
                return new ErrorModel('登录失败,账号密码不匹配')
            }
        })
    }

控制台报错:
(node:9540) UnhandledPromiseRejectionWarning: TypeError [ERR_INVALID_CHAR]: Invalid character in header content [“Set-Cookie”]
at ServerResponse.setHeader (_http_outgoing.js:521:3)
我看了和老师写的是一样的呢,它说我设置了一个无效header, 的这是什么原因报错呢?

正在回答 回答被采纳积分+3

插入代码

3回答

我不是蜗牛 2021-08-16 10:19:51

以下测试可行

设置时:

const cookBuf = `username=${encodeURIComponent(data.username)}; path=/`;

res.setHeader('Set-Cookie', cookBuf);

读取时:

const cookie = decodeURIComponent(req.headers.cookie || '');


1 回复 有任何疑惑可以回复我~
qq_一咻_0 2020-11-07 14:48:46

倒腾了半夜也没找到方案,其实是http协议的Header头有字符限制,下图是stackoverflow的解答,http的header字符集支持US-ASCII子集的字符集,故设置中文是'utf8'时就会报上面错误。

故解决方案:
把字符串转成base64即可

this.cookies.set('test', new Buffer('我是koajs').toString('base64'))

new Buffer(str, 'base64').toString();//str是base64编码的字符串






0 回复 有任何疑惑可以回复我~
双越 2020-07-29 07:57:47

报错的详细截图给我

0 回复 有任何疑惑可以回复我~
  • 老师,就是需要使用Buffer.from(str).toString('base64')转一下编码格式。不然就报错.具体实施如下:
    let userCookie = Buffer.from(`userid=${userId}; path=/; httpOnly; expires=${getCookieExpires()}`).toString('base64')
    然后:
    res.setHeader('Set-Cookie', userCookie)
    回复 有任何疑惑可以回复我~ 2021-05-20 16:40:32
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号