Node.js 38

Nodejs Test하는 이유와 Jest

테스트를 하는 이유 자신이 만든 서비스가 제대로 동작하는지 테스트해야 함 기능이 많다면 수작업으로 테스트하기 힘듦 프로그램이 프로그램을 테스트할 수 있도록 자동화함 테스트 환경을 최대한 실제 환경과 비슷하게 흉내냄 아무리 철저하게 테스트해도 에러를 완전히 막을 수는 없음 테스트를 하면 좋은 점 하지만 허무한 에러로 인해 프로그램이 고장나는 것은 막을 수 있음 한 번 발생한 에러는 테스트로 만들어두면 같은 에러가 발생하지 않게 막을 수 있음 코드를 수정할 때 프로그램이 자동으로 어떤 부분이 고장나는 지 알려줌 Jest 설치하고 실행해보기 (개발용) npm i –D jest Nodebird 프로젝트를 그대로 사용함 routes 폴더 안에 middlewares.test.js 작성 테스트용 파일은 파일명에 te..

Node.js 2021.01.12

CORS 에러 이해하기

CORS에러 브라우저간의 데이터를 주고받는 과정에서, 도메인 이름이 서로 다른 사이트간에 api요청을 할 때, 공유를 설정하지 않았다면 CORS에러가 발생한다. -> 서버가 발생시키는 것이 아니고 브라우저가 발생시키는 것이다. 그러나 해결은 서버에서 해줘야한다. (그렇기 때문에 초보자가 어려워 하는 것이다.) 브라우저(1111포트) - 프론트서버(1111포트) - 백엔드서버(2222포트) 위와 같이 브라우저와 서버간 관계가 있을때, 브라우저에서 도메인/포트가 다른 백엔드 서버로 요청이 갔을때, 보안을 위해 자체적으로 요청이 차단된다. CORS는 브라우저에서 발생하는 것이기 때문에 프론트서버-백엔드서버간 요청은 포트가 다르더라도 에러가 나지 않는다. 때문에 이점을 이용해 CORS를 해결할 수 있고, 간편하..

Node.js 2021.01.11

API 서버에서 사용량 제한하기

1. 사용량 제한 구현과 이유 DOS 공격 등을 대비해야 함 -> 새로고침을 계속하면서 공격하는 것 (무차별 요청) 일정 시간동안 횟수 제한을 두어 무차별적인 요청을 막을 필요가 있음 npm i express-rate-limit apiLimiter 미들웨어 추가 windowMS(기준 시간), max(허용 횟수), delayMS(호출 간격), handler(제한 초과 시 콜백 함수) deprecated 미들웨어는 사용하면 안 되는 라우터에 붙여서 사용 시 경고 const jwt = require('jsonwebtoken'); exports.isLoggedIn = (req, res, next) => { if (req.isAuthenticated()) { next(); } else { res.status(40..

Node.js 2021.01.11

Nodejs 호출 서버 만들기

app.js 파일 생성 소스 코드는 https:.//github.com/zerocho/nodejs-book/ch10/10.4/nodecat views/error.html는 nodebird-api로부터 복사 아까 발급받은 비밀키를 .env에 입력 views/error.html {{message}} {{error.status}} {{error.stack}} routes/index.js 생성 GET /test에 접근 시 세션 검사 세션에 토큰이 저장되어 있지 않으면 POST http://localhost:8002/v1/token 라우터로부터 토큰 발급 이 때 HTTP 요청 본문에 클라이언트 비밀키 동봉 발급에 성공했다면 발급받은 토큰으로 다시 GET https://localhost:8002/v1/test 라우..

Node.js 2021.01.10

Node에서 API 서버 만들기

크롤링은 서버에 부담을 많이 일으킨다. 잘못하면 디도스 공격이 될 수도 있다. -> API를 제공하는 것이 좋다. API 서버 이해하기 NodeBird SNS 서비스 API: Application Programming Interface 다른 애플리케이션에서 현재 프로그램의 기능을 사용할 수 있게 함 웹 API : 다른 웹 서비스의 기능을 사용하거나 자원을 가져올 수 있게 함 다른 사람에게 정보를 제공하고 싶은 부분만 API를 열고, 제공하고 싶지 않은 부분은 API를 만들지 않으면 됨 API에 제한을 걸어 일정 횟수 내에서만 가져가게 할 수도 있음 NodeBird에서는 인증된 사용자에게만 정보 제공 내 애플리케이션을 제공 및 관리, 통제 가능 nodebird-api 폴더를 만들고 package.json ..

Node.js 2021.01.08

multer 사용해서 이미지 업로드 구현

form 태그의 enctype이 multipart/form-data body-parser로는 요청 본문을 해석할 수 없음 multer 패키지 필요 이미지를 먼저 업로드하고, 이미지가 저장된 경로를 반환할 것임 게시글 form을 submit할 때는 이미지 자체 대신 경로를 전송 fs.readdir, fs.mkdirSync로 upload 폴더가 없으면 생성 multer() 함수로 업로드 미들웨어 생성 storage: diskStorage는 이미지를 서버 디스크에 저장(destination은 저장 경로, filename은 저장 파일명) limits는 파일 최대 용량(5MB) upload.single(‘img’): 요청 본문의 img에 담긴 이미지 하나를 읽어 설정대로 저장하는 미들웨어 저장된 파일에 대한 정보..

Node.js 2021.01.06

카카오 로그인 작업

developers.kakao.com/ 홈페이지에 들어가 로그인을 한 후 내 어플리케이션을 등록한다. 만든 애플리케이션을 클릭한 후 목록에 들어가 플랫폼을 클릭한다. 카카오 로그인에 들어가 활성화를 해준다. 그리고 밑에 있는 Redirect URI를 수정해준다. 다음은 동의 항목에 들어가서 받을 것들을 선택하면 된다. 사용법은 목록에 있던 앱키에 들어가 Rest_API 키를 복사해 .env 파일에 KAKAO_ID=Rest_API_key 이렇식으로 추가해주면 된다. pastposs/kakaoStrategy.js const passport = require('passport'); const KakaoStrategy = require('passport-kakao').Strategy; const User = r..

Node.js 2021.01.06

패스포트 사용하기 (로그인 과정 helper)

로그인 과정을 쉽게 처리할 수 있게 도와주는 Passport 설치하기 비밀번호 암호화를 위한 bcrypt도 같이 설치 설치 후 app.js와도 연결 passport.initialize(): 요청 객체에 passport 설정을 심음 passport.session(): req.session 객체에 passport 정보를 저장 express-session 미들웨어에 의존하므로 이보다 더 뒤에 위치해야 함 passport/index.js 작성 passport.serializeUser: req.session 객체에 어떤 데이터를 저장할 지 선택, 사용자 정보를 다 들고 있으면 메모리를 많이 차지하기 때문에 사용자의 아이디만 저장 passport.deserializeUser: req.session에 저장된 사용자 ..

Node.js 2021.01.05

Nodejs 데이터 베이스 셋팅하기

models/user.js: 사용자 테이블과 연결됨 provider: 카카오 로그인인 경우 kakao, 로컬 로그인(이메일/비밀번호)인 경우 local snsId: 카카오 로그인인 경우 주어지는 id models/post.js: 게시글 내용과 이미지 경로를 저장(이미지는 파일로 저장) models/hashtag.js: 해시태그 이름을 저장(나중에 태그로 검색하기 위해서) 시퀄라이즈가 자동으로 생성해주는 코드 대신 다음과 같이 변경 모델들을 불러옴(require) 모델 간 관계가 있는 경우 관계 설정 User(1):Post(다) Post(다):Hashtag(다) User(다):User(다) 모델간의 관계들 associate에 작성 1대다: hasMany와 belongsTo 다대다: belongsToMany..

Node.js 2021.01.05

프로젝트 구조 갖추기

NodeBird SNS 서비스 만들어보자.. 기능: 로그인, 이미지 업로드, 게시글 작성, 해시태그 검색, 팔로잉 express-generator 대신 직접 구조를 갖춤 프런트엔드 코드보다 노드 라우터 중심으로 볼 것 관계형 데이터베이스 MySQL 선택 1. 폴더 생성 (프로젝트 넣을 폴더) 2. npm init 작성 3. 필요한 패키기 설치 4. npx sequelize init { const error = new Error(`${req.method} ${req.url} 라우터가 없습니다.`); error.status = 404; next(error); // error 미들웨어로 넘김 }); app.use((err, req, res, next) => { res.locals.message = err.me..

Node.js 2021.01.03