묻고 답해요
147만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨Slack 클론 코딩[백엔드 with NestJS + TypeORM]
yarn run db:create 시에 발생하는 데코레이터 오류
제목처럼 명령어 실행시 아래와 같은 오류가 발생했습니다.Decorating class property failed. Please ensure that transform-class-properties is enabled and r uns after the decorators transform.이 오류는 타입스크립트 데코레이터와 클래스 필드초기화 문제로 보입니다. 엔티티를 처리하는 과정에서 데코레이터가 클래스 필드와 충돌을 일으키는 것으로 보입니다. 갑자기 생긴 오류에 tsconfig.ts 파일도 수정해보고 엔티티를 다시 점검해봐도 오류가 해결이 안되서 질문드립니다.오류가 발생하는 부분입니다.at _initializerWarningHelper (src/entities/DMs.ts:12:964) at DMs.<instance_members_initializer> (src/entities/DMs.ts:58:286) at new DMs (src/entities/DMs.ts:58:270) at EntityMetadata.create (node_modules/src/metadata/EntityMetadata.ts:568:23) at EntityMetadataValidator.validate (node_modules/src/metadata-builder/EntityMetadataValidator.ts:211:47) at node_modules/src/metadata-builder/EntityMetadataValidator.ts:43:18 at Array.forEach (<anonymous>) at EntityMetadataValidator.validateMany (node_modules/src/metadata-builder/EntityMetadataValidator.ts:42:25) at DataSource.buildMetadatas (node_modules/src/data-source/DataSource.ts:730:33) at processTicksAndRejections (node:internal/process/task_queues:95:5) error Command failed with exit code 1.DMs 엔티티의 문제인가 싶어서 제로초님의 코드를 다시 작성해보고 살펴보아도 문제가 해결되지 않습니다.추가로 yarn seed명령어도 안됩니다,,,
-
미해결코로나맵 개발자와 함께하는 지도서비스 만들기 1
nodemon설치와 express-generator 오류
이러한 오류가 뜨는데 어떻게 해결할 수 있을까요?개발환경은 windows입니다.
-
미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
npm run db:create 시에 발생하는 decorating 오류
cli 통해서 db생성을 하면 migration 테이블이 생기지 않아서 오류를 들여다 봤더니 아래와 같은 오류가 생겼습니다.ERROR Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform. 데코레이터를 적용하는 과정에서의 이슈로 보이는데 수업 과정을 이수하는 시점까지 별다른 문제나 별개의 코드를 작성하지 않았기에 의문점이 있는 상태입니다. 오류가 발생하는 구간은 아래 코드와 같습니다.at _initializerWarningHelper (C:/Users/user/Desktop/Study/nestjsbook/src/entities/Mentions.ts:12:1005) at Mentions.<instance_members_initializer> (C:/Users/user/Desktop/Study/nestjsbook/src/entities/Mentions.ts:61:291) at new Mentions (C:/Users/user/Desktop/Study/nestjsbook/src/entities/Mentions.ts:61:270) at EntityMetadata.create (node_modules\src\metadata\EntityMetadata.ts:568:23) at EntityMetadataValidator.validate (node_modules\src\metadata-builder\EntityMetadataValidator.ts:211:47) at node_modules\src\metadata-builder\EntityMetadataValidator.ts:43:18 at Array.forEach (<anonymous>) at EntityMetadataValidator.validateMany (node_modules\src\metadata-builder\EntityMetadataValidator.ts:42:25) at DataSource.buildMetadatas (node_modules\src\data-source\DataSource.ts:730:33) at processTicksAndRejections (node:internal/process/task_queues:95:5) Mentions만에 문제인가 싶어서 Entities를 제거하고 다른 특정 하나(Users)의 Entity만 포함시켜서 실행했을 때도 동일한 오류를 뱉고 있어요.tsconfig가 컴파일될 때, 제 때 동작이 안되는가 싶어 바벨을 설치해서 플러그인을 주입해도 동일한 현상이 발생되네요 ㅠㅠ 물론 tsconfig에 데코레이터 관련 옵션이 true이긴 합니다. emitDecoratorMetadata: true experimentalDecorators : truescript"db:create": "ts-node ./node_modules/typeorm-extension/bin/cli.cjs db:create -d ./dataSource.ts", "db:drop": "ts-node ./node_modules/typeorm-extension/bin/cli.cjs db:drop -d ./dataSource.ts",참고로 db:drop시에는 오류가 없이 잘 동작합니다.
-
미해결이미지 관리 풀스택(feat. Node.js, React, MongoDB, AWS)
프록시 관련 질문
안녕하세요 강사님,proxy 설정을 하면 이렇게 오류가 뜨면서 서버 시작이 안돼요.프록시 부분을 지우면 잘 작동하는데어디가 잘못된걸까요?
-
미해결[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
chat.adapter.rooms의 시간순 정렬 여부
// socket.js socket.on('disconnect', async () => { console.log('chat 네임스페이스 접속 해제'); // /room/방아이디 => URL에서 가져오기. const { referer } = socket.request.headers; const roomId = new URL(referer).pathname.split('/').at('-1'); const currentRoom = chat.adapter.rooms.get(roomId); // 현재 방의 인원이 0이면(방장도 나감) 자동삭제. const userCount = currentRoom?.size || 0; if (userCount === 0) { await removeRoom(roomId); room.emit('removeRoom', roomId); // room 네임스페이스에 이 방이 제거됬다고 알려서 실시간으로 제거할 것임. console.log('방 제거 요청 성공'); } else { // 시스템 메시지 DB 저장 const systemChat = `${socket.request.session.color}님이 퇴장하셨습니다.`; await createChat(roomId, 'system', systemChat); const memberList = [...currentRoom].map((socketId) => { return { color: chat.sockets.get(socketId).request.session.color, socketId, }; }); // 누군가 나가면 그 방의 모든 사람에게 시스템 메시지 및 정보 전달. socket.to(roomId).emit('exit', { user: 'system', chat: systemChat, memberList, }); } }); }); }; 여기서 chat.adapter.rooms.get(roomId) = currentRoom이 Set객체인데 여기 쌓이는 socketId들은 접속한 순서대로 쌓이나요? 그러니까, 시간순 정렬이 되어있는 건가요? 방장 위임하는 기능 구현 중인데 '방에 방장 정보를 저장한다' 이걸 어떻게 해야할 지 모르겠습니다🤔
-
미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
RxJS 디버깅 질문 있습니다.
안녕하세요. 제로초님 제가 좀 질문이 많은 것 같은데, 항상 친절하게 답변해주셔서 감사합니다.다름이 아니라, 개발하면서 IDE의 디버깅 모드를 이용해본적이 거의 없고, 항상 값의 흐름과 변화를 콘솔로 찍어서 디버깅을 하곤 했는데, 디버깅 모드를 사용하면 좀 더 편하게 확인이 가능 한 것 같더라구요.그래서 한번 사용해보려고 했는데, 그냥 일반적인 crud api를 만들어서 중단점 찍고 디버깅을 돌려봤을때는 요청이 가다가 멈추고 값이 잘 나타나는걸 확인 할 수 있었습니다. 하지만, MSA로 구성되어있는 프로젝트에서 디버깅을 실행해보니까 중단점을 설정해놔도 걸리지가 않더라구요. 요청과 응답은 다르지 않을텐데 MSA라서 안되는건가 싶기도 해서 좀 찾아보니까 RxJS에서 디버깅 중단점이 잘 안된다는 글을 발견했습니다. 혹시 제로초님께서도 Observable같은 RxJS를 사용하시면서 디버깅에 어려움을 겪으셨던 경험이 있으신가요? 웹스톰 사용하시는걸로 알고있는데, 디버깅 어떻게 진행하시는지 공유해주시면 정말 도움이 많이 될 것 같습니다! 매번 콘솔로 확인하려니까 생산성이 너무 떨어지네요 ㅠ
-
미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
CacheManager에 대해 질문 있습니다.
안녕하세요. 최근에 게시물 조회수 카운팅 작업을 하고 있습니다. 어떻게 구성을 할 지 생각을 좀 해보다가, `CacheManger (https://docs.nestjs.com/techniques/caching) 를 사용해서(entity-id-ip):(timestamp)이렇게 key-value 형태로 담아서 메모리에 저장하고, ttl을 1시간으로 설정해서 만약에 키가 존재하면 조회수가 오르지 않고, 값을 현재 시간으로 업데이트 해주고, 키가 없으면 값을 넣어주고 조회수 +1을 해주게 로직을 설정했습니다.그런데 이게 로컬환경에서는 잘 되는데, 이상하게 배포환경에서는 정상적으로 작동하지 않습니다. 그래서 Redis를 설치해서 해보자니 제가 NestJS 10버전을 사용하고 있는데 쉽게 도와주는 라이브러리가 9버전까지만 지원해서 버전을 낮추기도 좀 그렇고, 얘도 어쨌든 메모리를 사용하는 거라 똑같을 것 같아서 우선 보류해뒀습니다. 마지막으로 쿠키를 사용해서, entity키에 값으로 게시물의 id를 담아 해당 게시물이 값에 존재하면 조회수가 올라가지 않도록 해봤는데, 이건 로컬 환경에서도 잘 안먹히고있어서 도통 어떻게 해야할지 감이 안와 막혀있습니다 ㅜㅜ CacheManger를 사용해서 해결하면 좋을 것 같은데, 배포 환경에서는 왜 작동이 안되는지 혹시 원인을 아시나요? 그리고 제로초님께서 추천해주시는 방법도 궁금합니다 ㅠ달성하고자 하는 목적은 일정 기간동안 같은 방문자의 게시글 조회수 카운팅을 +1 만 하는 것입니다!
-
미해결[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
강의 9장 - 3 실습중에 오류를 못찾겠어요.
Error: Route.post() requires a callback function but got a [object Undefined] at Route.<computed> [as post] (C:\nodeSns\sns\node_modules\express\lib\router\route.js:216:15) at proto.<computed> [as post] (C:\nodeSns\sns\node_modules\express\lib\router\index.js:521:19) at Object.<anonymous> (C:\nodeSns\sns\routes\auth.js:13:8) at Module._compile (node:internal/modules/cjs/loader:1358:14) at Module._extensions..js (node:internal/modules/cjs/loader:1416:10) at Module.load (node:internal/modules/cjs/loader:1208:32) at Module._load (node:internal/modules/cjs/loader:1024:12) at Module.require (node:internal/modules/cjs/loader:1233:19) at require (node:internal/modules/helpers:179:18) at Object.<anonymous> (C:\nodeSns\sns\app.js:12:20) npm start 하면 자꾸 이 오류가 뜨는데 원인을 못 찾겠습니다.
-
미해결[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
authorization 헤더와 jwt 저장 위치
내 게시물 모두 불러오기나 해시태그로 검색하기 등 api 서버에 요청 보낼 때 authorization 헤더에 jwt를 넣어서 보내도록 코딩 했는데 이를 확인할 수 있는 방법이 궁금합니다. 그리고 아래 화면에서 connect.sid로 전달된 세션 키와 연결된 세션에 해당 사용자의 jwt 값이 req.session.jwt로 들어있는 건가요?
-
미해결[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
에러 처리 방법
9강에서는 대체로 console.error(err); next(err);이런 식으로 에러를 처리했고 10강에서는 res.json으로 에러 코드, 메세지를 반환하고 있는데 이 둘의 차이가 뭔가요?에러 처리 미들웨어를 사용할 때와 json을 반환할 때를 어떻게 정할 수 있는지(?) 기준이 궁금합니다.
-
미해결[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
NodeBird 서비스의 화면 렌더링 방식에 대해 질문 드립니다!
궁금한 점이 있습니다.9강에서 만든 NodeBird 서비스의 구조는 프론트엔드가 따로 있는 것이 아니라 서버 측에서 nunjucks와 html 파일들을 사용하여 화면을 구성하는 것이 맞나요?1번이 맞고, 백엔드에서 직접 html을 생성하여 클라이언트에게 제공하는 구조라면 제가 공부한대로는 SSR 방식인 것 같은데 맞나요?프론트엔드를 따로 만들어서 서버와 연동하려면 app.js의 아래 코드와 views 폴더를 삭제하고 프론트 쪽에서 서버 측에서 만든 주소들을 호출하면 되나요?// app.js의 일부 app.set("view engine", "html"); nunjucks.configure("views", { express: app, watch: true, });
-
미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
로깅은 어떻게 하는게 효율적일까요?
안녕하세요. 몇가지 질문이 있습니다. 저는 NestJS에서 지원하는 @nest/common 패키지의 Logger를 사용해왔는데요. MTTD를 최소화 하기 위해서 다른 사람들은 로깅을 어떻게 하는지 찾아보다 winston과 pino 라이브러리를 발견했습니다. 이런 라이브러리들과 NestJS에 내장되어 있는 Logger와는 어떤 차이가 있나요? 커스텀 하는 기능 외에 성능적으로 우위가 있는건가요?현업에서는 보통 로그를 어떻게 남기나요? 제로초님은 현업에서 로그 모니터링 도구로 Data Dog과 Sentry를 사용하신다고 하셨는데 저는 와탭랩스를 사용해보려고 합니다. 이 때, 로그는 보통 어떤 형식으로 남기시나요?제가 계획하고 있는 구조는 미들웨어에서 아래처럼 남겨주고, 에러가 발생하면 ExceptionFilter에서 한번 더 위의 형식에 에러 메시지를 포함해서 로그를 남겨주려고 합니다.LOG [HTTP] [DateTime] [method] [statusCode] [responseTime] - [url] - [ip] - [userAgent]제로초님의 로그 구성이 궁금합니다.감사합니다.
-
미해결[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
팔로잉과 팔로워 관계
deserializeUser에서 req.user에 넣을 팔로잉이랑 팔로워 찾으실 때, as는 모델 관계의 as를 따라간다고 하셨는데 왜 위 코드에서 Follwers가 //팔로잉이고 Followings가 //팔로워라고 하신 건지 모르겠습니다ㅜ 예를 들어, 저의 팔로잉을 찾으려면 제 아이디를 팔로워 아이디에서 찾아야 하니까 기준 아이디가 followerId가 되는 Followings가 맞는거 아닌가요?
-
해결됨[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
nodebird 프로필 수정 기능 구현 시, 에러가 발생했을 때 에러처리미들웨어에서 res.render('error')가 안되는 상황
프로필 수정 기능을 구현하기 위한 profileUpdate.html{% extends 'layout.html' %} {% block content %} <div class="timeline"> <form id="profile-update-form"> <!-- <div class="input-group"> <label for="join-email">이메일</label> <input id="join-email" type="email" name="email" /> </div> --> <div class="input-group"> <label for="join-nick">닉네임</label> <input id="join-nick" type="text" name="nick" /> </div> <div class="input-group"> <label for="join-password">비밀번호</label> <input id="join-password" type="password" name="password" /> </div> <button id="join-btn" type="submit" class="btn">수정</button> </form> </div> {% endblock %} {% block script %} <script src="https://unpkg.com/axios/dist/axios.min.js"></script> <script> window.onload = () => { const errorParam = new URL(location.href).searchParams.get('error'); if (errorParam) { alert(errorParam); } }; if (document.getElementById('profile-update-form')) { document.addEventListener('submit', async (event) => { event.preventDefault(); const formData = new FormData(event.target); const config = { headers: { 'content-type': 'application/json', }, }; axios .put('/profile/update', formData, config) .then((res) => { alert('프로필 정보가 수정되었습니다.'); window.location.href = '/profile'; }) .catch((error) => { alert(error); }); }); } </script> {% endblock %} 그리고 controller/page.jsexports.renderProfileUpdate = (req, res, next) => { res.render('profileUpdate', { title: '내 정보 수정 - NodeBird' }); }; exports.profileUpdate = async (req, res, next) => { try { const { nick, password } = req.body; const id = req.user.id; const exUser = await User.findOne({ where: { id } }); if (!exUser) { throw new Error('존재하지 않는 사용자입니다.'); // res.status(404).send('no user'); } const sameNickUser = await User.findOne({ where: { nick, id: { [Op.ne]: exUser.id, }, }, }); if (sameNickUser) { throw new Error('중복된 닉네임입니다.'); // res.status(501).send('중복된 닉네임입니다.'); } const hash = await bcrypt.hash(password, 12); exUser.set({ nick, password: hash, }); await exUser.save(); res.status(201).send(); } catch (error) { console.error(error); next(error); } };app.js의 에러처리 미들웨어app.use((err, req, res, next) => { // 404 다음은 에러처리 미들웨어 console.error('에러는 ', err.message); res.locals.message = err.message; res.locals.error = process.env.NODE_ENV !== 'production' ? err : {}; // 보안상 위험(오히려 배포 시 사용자 화면에 에러를 숨김) // 에러를 로깅 서비스에 넘김 res.status(err.status | 500); res.render('error'); // views/error.html });일부러 중복된 닉네임을 넣어 라우터에서 에러를 발생시켰을 때, 에러처리미들웨어의 console.error('에러는 ', err.message); 부분에서 "Error: 중복된 닉네임입니다. at exports.profileUpdate (/nodestudy/nodebird/controllers/page.js:31:13) at process.processTicksAndRejections (node:internal/process/task_queues:95:5)에러는 중복된 닉네임입니다.PUT /profile/update 500 10.568 ms - 1862" 로 에러 메시지가 정상적으로 찍히는 것을 확인하였습니다.preview 탭에선 정상적으로 나오는 것 같은데, 실제 브라우저 화면에선 위와 같이 뜨면서 제가 원하는 에러 메시지('중복된 닉네임입니다')가 alert 창에 뜨지 않으며, error.html이 렌더링도 되지 않고 있습니다. 구글링해봐도 제가 잘 못한건지 이유를 못찾겠습니다🥲 제가 뭘 놓친걸까요?
-
미해결[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
connect.sid를 쿠키에 넣는 시점과 express-session
req.login를 통해 req.session에 { 랜덤값: 유저아이디}를 저장하는 건 알겟는데, connect.sid=랜덤값을 쿠키에 넣는 시점은 언제인가요?그리고 서버가 connect.sid를 세션 쿠키로 전송할 때, express-session 은 자동으로 이 값을 secret으로 서명하여 전송하나요?
-
미해결[웹 개발 풀스택 코스] Node.js 프로젝트 투입 일주일 전 - 기초에서 실무까지
sql버전안맞음
저의 경우 client sql 버전이 안맞다고 나옵니다 workbench는 8.0Mysql 9.0 Configurator로 설치했습니다 stackoveflow에서 찾아보니ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';Where root as your user localhost as your URL and password as your passwordThen run this query to refresh privileges:flush privileges;Try connecting using node after you do so.If that doesn't work, try it without @'localhost' part. 이런 답변이 있는데 어떻게 적용하는지 알 수 있을까요?
-
해결됨[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
express.static의 요청 처리
app.use('/', express.static(path.join(__dirname, 'public')));다른 코드들에서는 이런 식으로 경로를 지정하면 경로와 똑같은 요청만 처리를 하거나 모든 요청에 대해 처리하고 싶으면 그냥 경로를 생략하였는데 express.static은 왜 localhost:3000/ 에 대한 요청만 받아들이는 것이 아니라, 모든 요청에 대해 해당 파일이 있는지 확인하게 되는지 궁금합니다. 예시)localhost:3000/about -> public 폴더 안에 about 파일이 있는지 찾음 localhost:3000/hello.css-> public 폴더 안에 hello.css 파일이 있는지 찾음express.static은 특별한 미들웨어 인가요?
-
미해결[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
`app.use`의 용도에 대해 질문 드립니다!
궁금한 점이 있습니다. 지금까지는 다음과 같이 app.use 안에 요청 처리를 위한 미들웨어를 작성했는데, app.use((req, res, next) => { console.log("모든 요청에 실행하고 싶어요"); next(); });다음과 같이 app.use에 다운받은 미들웨어를 장착하는 건 "이 파일에서 특정 미들웨어를 사용하겠다"는 의도로 사용하는 건가요?? 아니면 둘 다 같은 동작을 하는건데 제가 둘을 다르다고 생각하는 걸까요?app.use(morgan("dev")); app.use(cookieParser()); app.use(express.json()); app.use(express.urlencoded({ extended: true }));추가로, 위 미들웨어들로 인해 req이나 res 객체에서 편하게 .cookie나 .body를 사용할 수 있게 되는데 그럼 미들웨어 내에서 미들웨어를 사용하는 건가요 🤔🤔?
-
미해결[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
어떤 객체가 이벤트를 발생시키는지
여러 챕터에서 객체의 on 메서드를 사용하는 코드가 자주 보여서 개념에 대해 알아보았습니다.const fs = require("fs"); console.log("before:", process.memoryUsage().rss); // 메모리 체크 // 스트림 방식으로 파일 읽고 보내기 const readStream = fs.createReadStream("./big.txt"); const writeStream = fs.createWriteStream("./big3.txt"); readStream.pipe(writeStream); readStream.on("end", () => { console.log("stream: ", process.memoryUsage().rss); });그런데 이렇게 이벤트가 발생하는 객체의 종류를 모두 외우고 있어야 하나요? 아니면 이 객체가 이벤트를 발생시키는지 예상(?), 판단할 수 있는 기준이 있나요?
-
해결됨하루만에 배우는 express with AWS
postgresql connect() 문제
강의내용에 추가내용으로 환경설정 업데이트가 되어야할것 같습니다.... 환경설정으로 시간을 허비하는군요. 연결 관련으로const pool = new Pool({ host: "", user: "", port: , password: "",});ssl 인증서 허용 옵션을 풀어야 연결이 되었습니다. const pool = new Pool({ host: "", user: "", port: , password: "", ssl: { rejectUnauthorized: false, },});