TIL/Node.js, express (10) 썸네일형 리스트형 req.body에 한글이 넘어와서 TypeError 발생 (Request path contains unescaped characters) 문제 상황 유저가 입력한 url을 전달 받아 이를 크롤링하는 코드가 구동중이다. 그런데 Velog의 경우, 다음과 같이 url에 한글이 포함되는 경우가 있다. “https://velog.io/@username/가나다라마바사” request 값으로 한글을 전달받게 되면 다음과 같은 에러가 발생한다. TypeError [ERR_UNESCAPED_CHARACTERS]: Request path contains unescaped characters 해결 자바스크립트 내장 함수인 encodeURI()를 쓰면 된다. encodeURI(req.body.url) 하지만 전달받는 값이 한글이 아니라 영문일 경우, encodeURI로 감싸게 되면 원래의 문자열과 달라진다. 전달받는 값이 한글일때를 식별하여 encodeURI.. Sequelize 시차 발생 현상 해결 Sequelize에서 모델을 생성할 때, 'timestamps: true' 설정을 추가하면 DB에 현재 시각이 created_at 컬럼에 자동으로 추가된다. 그러나 Sequelize의 기본 시간 설정은 UTC(Universal Time Coordonne)이고, 이는 영국 시간을 기준점으로 하기 때문에 우리나라보다 9시간이 느린 값을 가진다. 따라서 이를 우리나라 시간으로 반영하기 위해서는 Sequelize의 config 파일에 "timezone": "+09:00" 설정을 추가해줘야 한다. 그러나 여기서 끝이 아니다. DB에 저장된 datetime 값을 find로 조회하게 되면, timezone 적용 이전 시각(UTC 기준 시각)이 다시 표시된다. (로드시 nodejs가 자체의 타임존 설정에 따라 시간을 .. SameSite 정책으로 인해 브라우저로 쿠키가 전송되지 않는 문제 해결 배경 서버에서 클라이언트(브라우저)로 쿠키에 값을 담아 보내야 할 때, res.cookie(key, value)와 같은 형태로 보낸다. 그런데 이때, 쿠키를 주고 받는 서버와 클라이언트의 origin(출처)가 다르므로, 추가 설정을 하지 않는다면 CORS(Cross-Origin Resource Sharing) 에러가 뜬다. 더보기 CORS, origin(출처) 란? CORS(Cross-Origin Resource Sharing) 말 그대로 서로 다른 origin 간에 리소스를 주고 받을 때와 관련한 보안 정책이다. origin은 어디까지를 의미하나? 보통 origin이라 함은 프로토콜과 호스트, 그리고 포트 번호까지를 합친 값을 의미한다. 즉, 포트번호까지 같아야 cors에 해당하지 않는다. 이때 ‘쿠키.. node.js로 웹페이지 스크래핑하기 (feat. cheerio) cheerio를 사용한 스크래핑 node.js에서 웹페이지의 html을 파싱하여 스크래핑하기 위해서는 cheerio라는 툴을 사용해야 한다. const cheerio = require(”cheerio”)로 불러와서 사용하면 되고, 일반적인 웹사이트에는 SEO를 위해 다음과 같이 메타 태그가 적용되어 있기 때문에, 이를 이용하여 cheerio로 관련 정보를 불러올 수 있다. const html = await axios({ url: req.body.url, method: "GET", }); const $ = cheerio.load(html.data); crawledData = { image: $('head meta[property="og:image"]').attr("content"), desc: $('hea.. Node.js(express) & React를 이용한 카카오 소셜 로그인 구현하기 - 2 router.get( "/kakao/callback", async (req, res, next) => { let token; // 사용자가 '동의하고 계속하기'를 누르면 redirect uri로 인가코드가 전송됨.(get요청) 이를 담아서 다시 카카오 서버로 POST 요청을 보내서 액세스 토큰을 받는 과정 try { token = await axios({ method: "POST", url: "https://kauth.kakao.com/oauth/token", headers: { "content-type": "application/x-www-form-urlencoded", }, data: qs.stringify({ grant_type: "authorization_code", //특정 스트링 client_.. Node.js(express) & React를 이용한 카카오 소셜 로그인 구현하기 - 1 이 글 하나면 적어도 nodejs 기반의 REST API 방식 카카오 로그인 구현은 확실히 이해하고 실행할 수 있다. 코딩을 '많이' 하는것도 중요하지만, 배운 내용을 '확실히' 정리하는 것의 필요성을 부쩍 느끼고 있다. 하루, 이틀, 길게는 일주일이 넘는 시간 동안 고민을 하던 문제를 해결하여도 따로 기록으로 남기지 않고 '이만큼 오래 고민했으면 머리에 알아서 남았겠지' 하는 안일한 생각으로 그냥 넘어갔던 것들이 있는데, OAuth(카카오) 로그인도 그 중 하나였다. 이번이 세 번째 구현인데도 헤매는 나를 보면서 다시금 확실히 정리해야 겠다고 생각했다. 우선 Kakao Developers에 나와 있는 카카오 로그인 관련 로직은 다음과 같다. 우선, 로그인을 왜 하는걸까? A라는 사람이 B쇼핑몰 웹사이트.. req.params와 req.query의 차이 <TIL_2022_08_13> req.params는 url을 분석하여 ‘이미 예약된 값’을 받아옴. // 서버 post.get("/:id/:name", function); // 클라이언트 await axios({ method: "get", url: "www.example.com/1/mj", params: {title: "hello!"}, }) 코드가 위와 같을때, 전송되는 url은 ‘www.example.com/1/mj?title=hello!’이다. 이 경우 req.params와 req.query를 출력하면 나오는 값을 각각 다음과 같다 console.log(req.params); // {id: "1", name: "mj"} console.log(req.query); // {title: "hello"} req.query는 url에서 .. Node.js/Express) PM2 사용법, 코어와 쓰레드 <TIL_2022_08_05> 1. PM2 [NODE] 📚 PM2 모듈 사용법 - 클러스터 / 무중단 서비스 pm2는 node.js 어플리케이션을 쉽게 관리할 수 있게 해주는 Process Manager임 기본적으로 싱글 스레드인 node.js를 멀티 스레드로 관리할 수 있게 해줌. pm2 start 설정 파일 명(보통 ecosystem.config.js)으로 실행 만약 서버가 8코어 16스레드라면, 최대 16개 코어를 사용할 수 있지만 노드가 싱글 스레드이기 때문에 활용을 못하는 문제 → ‘클러스터 모듈'을 통해 단일 프로세스를 멀티 프로세스로 늘릴 수 있다. (마스터 프로세스에서 코어 수만큼 워커 프로세스를 생성해서 모든 코어를 사용하게 함.) 그러한 클러스터 모듈의 관리를 편리하게 해주는게 pm2 pm2의 기능 서비스 서버가 중.. 이전 1 2 다음 목록 더보기