본문 바로가기
TIL/Node.js

Nodejs 에러 | ERR_INVALID_CHAR

by 홍차23 2019. 12. 31.

 

에러>

TypeError [ERR_INVALID_CHAR]: Invalid character in header content ["Set-Cookie"]

 

문제 발생한 코드>

const http = require('http');
const fs = require('fs');
const url = require('url');
const qs = require('querystring');

const parseCookies = (cookie = '') =>
    cookie  
        .split(';')
        .map(v => v.split('='))
        .map(([k, ...vs]) => [k, vs.join('=')])
        .reduce((acc, [k,v]) => {
            acc[k.trim()] = decodeURIComponent(v);
            return acc;
        }, {});

http.createServer((req,res) => {
    const cookies = parseCookies(req.headers.cookie);
    if(req.url.startsWith('/login')) {
        const {query} = url.parse(req.url);
        const {name} = qs.parse(query);
        const expires = new Date();
        expires.setMinutes(expires.getMinutes() + 5);
        res.writeHead(302, {
            Location: '/',
            'Set-Cookie' : `name=${encodeURIComponent(name)};
            Expires=${expires.toGMTString()}; HttpOnly; Path=/`,

        });
        res.end();
    } else if(cookies.name) {
        res.writeHead(200, { 'Content-Type' : 'test/html; charset=utf-8'});
        res.end(`${cookies.name}님 안녕하세요`);
    } else {
        fs.readFile('./server4.html', (err,data) => {
            if(err) {
                throw err;
            }
            res.end(data);
        });
    }
})
    .listen(8083, () => {
        console.log('8083 port waiting');
    });

 

해결방법>

Expires 앞에 줄바꿈을 제거한다. 

const http = require('http');
const fs = require('fs');
const url = require('url');
const qs = require('querystring');

const parseCookies = (cookie = '') =>
    cookie  
        .split(';')
        .map(v => v.split('='))
        .map(([k, ...vs]) => [k, vs.join('=')])
        .reduce((acc, [k,v]) => {
            acc[k.trim()] = decodeURIComponent(v);
            return acc;
        }, {});

http.createServer((req,res) => {
    const cookies = parseCookies(req.headers.cookie);
    if(req.url.startsWith('/login')) {
        const {query} = url.parse(req.url);
        const {name} = qs.parse(query);
        const expires = new Date();
        expires.setMinutes(expires.getMinutes() + 5);
        res.writeHead(302, {
            Location: '/',
            'Set-Cookie' : `name=${encodeURIComponent(name)};Expires=${expires.toGMTString()}; HttpOnly; Path=/`,

        });
        res.end();
    } else if(cookies.name) {
        res.writeHead(200, { 'Content-Type' : 'test/html; charset=utf-8'});
        res.end(`${cookies.name}님 안녕하세요`);
    } else {
        fs.readFile('./server4.html', (err,data) => {
            if(err) {
                throw err;
            }
            res.end(data);
        });
    }
})
    .listen(8083, () => {
        console.log('8083 port waiting');
    });

댓글