묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 쇼핑몰 사이트 만들기[전체 리뉴얼]
heroku 배포후 master 브랜치에 push 할때마다 이미지가 날라가는거 해결방법이 있을까요??
배포한 앱에서 사진을 업로드하면 서버의 upload 폴더에 사진이 저장되어있을텐데 수정할 부분이 있어서 수정하고 다시 push 하면 서버의 upload 폴더가 local의 upload 폴더로 바뀌기 때문에 날라가는거 같은데 다시 push 했을때 서버가 가지고있는 이미지를 안날라가게 하는 방법이 있을까요?
-
미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
.listen
강의에서 8번째 줄에 그냥 .listen이 이해가 가질 않습니다. 보통 .이면 메소드?를 불러오는건데 어떤놈의 메소드(함수)인지 궁금합니다
-
미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
안녕하세요 강사님 실행할때 오류가 발생해서 질문드립니다.
Error: Cannot find module 'app.model' Require stack: - D:\Study\Inflearn\NestJS\Express\letsStart\dist\app.js at Function.Module._resolveFilename (node:internal/modules/cjs/loader:933:15) at Function.Module._load (node:internal/modules/cjs/loader:778:27) at Module.require (node:internal/modules/cjs/loader:1005:19) at require (node:internal/modules/cjs/helpers:102:18) at Object.<anonymous> (D:\Study\Inflearn\NestJS\Express\letsStart\dist\app.js:4:19) at Module._compile (node:internal/modules/cjs/loader:1101:14) at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10) at Module.load (node:internal/modules/cjs/loader:981:32) at Function.Module._load (node:internal/modules/cjs/loader:822:12) at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12) { code: 'MODULE_NOT_FOUND', requireStack: [ 'D:\\Study\\Inflearn\\NestJS\\Express\\letsStart\\dist\\app.js' ] } npm run start:dev 했을때 이와같은 오류가 발생하고 postman도 마찬가지로 localhost:8000으로 get 검색시 찾지 못하는데 어느 부분에서 잘못됬는지를 모르겠습니다. 코드는 오타 없이 강사님이 작성한것과 동일합니다.
-
해결됨따라하며 배우는 노드, 리액트 시리즈 - 영화 사이트 만들기
더보기 버튼 클릭 시 경고메세지가 나옵니다.
안녕하세요? 더보기 버튼을 클릭하면 아래쪽으로 20개씩 영화 리스트가 쭉 뻗어나가는 기능은 정상적으로 작동합니다. 그런데 더보기를 누를 때마다 저런 경고메세지가 나옵니다. 다른분들 글을 보고 참고해서 MainMovieImage에 초기값으로 null을 넣어주었고, 선생님 코드와 비교해봐도 다른점이 없습니다. 그리고 저는 웹 페이지를 처음 로드했을 때는 아무런 에러가 없다가, loadMore 버튼만 누르면 이러는데..어떻게 해결해야 할까요 ㅠ
-
해결됨탄탄한 백엔드 NestJS, 기초부터 심화까지
TypeORM 트랜잭션 질문드립니다.
안녕하세요 윤상석 강사님. TypeORM의 트랜잭션 관련으로 질문이 있습니다.TypeORM에서 트랜잭션을 다루는 방법은 이전 질문글에 답변해주셨듯이 크게 3가지인 것으로 알고 있습니다.1. QueryRunner2. getConnection, getManager3. @Transactional개인적으로는 @Transactional() 데코레이터를 사용하는것이 편리하여 사용하고 있었는데요.NestJS 공식문서에서 데코레이터를 이용하는 것을 권장하지 않고 있고,구글링을 해보아도 유닛 테스트에 어려움이 있어 권장하지 않는 분들이 많은 것을 알게되었습니다.여기서 첫 번째 질문이 있습니다.Q1. "유닛 테스트에 어려움이 있다"는 이야기가 구체적으로 무슨 의미인지 궁금합니다. 모킹이 어렵다. 내 마음대로 제어가 불가능하다 등의 이야기가 이해는 가는데 와닿지는 않아서 질문드립니다.----QueryRunner 방식을 이용하게 되면 try-catch-finally 코드가 강제가 되는 것 같아보입니다.여기서 두 번째 질문이 있습니다.Q2. 모든 에러를 감지하는 Filter를 적용해두었다면 QueryRunner를 사용하는 try-catch-finally 구문에서 에러 처리를 해버려 필터가 작동하지 않을 것 같은데 맞을까요?맞다면, 만약 Filter에서 요청이 실패하였을 때의 로깅기능이 있다고 가정한다면 로깅기능이 작동하지 않을 것 같습니다.그렇다면 catch 문에서 따로 Filter에서 구현한 로깅을 다시 구현해주어야 할까요?----트랜잭션 처리를 도와주는 typeorm-transactional-cls-hooked 패키지를 발견하였습니다.여기서 마지막 세 번째 질문이 있습니다.Q3. 해당 패키지는 유닛 테스를 할 때 트랜잭션 기능이 작동하지 않도록 모킹기능도 제공해주는 것 같습니다. QuerryRunner 보다 안 좋은점이 있다면 어떤 점이 있을까요?----질문이 너무 많은 것 같아 죄송합니다.좋은 강의와 답변해주셔서 항상 감사합니다.
-
미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
useFactory 사용시 resource 파일 분리 후 di 방법
먼저 너무 좋은 ADMIN 대시보드 라이브러리를 알려주셔서 감사합니다. 해당 라이브러리로 몇가지 테스트해보는 중인데 adminJsOptions가 너무 길어져 resources를 별도의 파일로 분리하려 하고 있습니다. 하다보니 이미 factory로 blogModel을 inject하고 있는데 resources를 별도의 파일로 분리하려고 보니 blogModel을 분리한 파일에서 어떻게 가져와야할지 막막하더라구요. adminjs뿐아니라 다른 모듈을 사용할때도 useFactory를 통해 di를 해주는경우가 많은데 이럴때는 분리된 파일에는 어떻게 의존성을 주입해줘야 할까요??? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 import * as AdminJSMongoose from '@adminjs/mongoose'; import { AdminModule as AdminBroModule } from '@adminjs/nestjs'; import { Module } from '@nestjs/common'; import { getModelToken } from '@nestjs/mongoose'; import AdminJS from 'adminjs'; import { Model } from 'mongoose'; import { UsersModule } from 'src/users/users.module'; import { User } from 'src/users/users.schema'; import { after, before } from './hooks/users.hooks'; AdminJS.registerAdapter(AdminJSMongoose); @Module({ imports: [ AdminBroModule.createAdminAsync({ imports: [UsersModule], inject: [getModelToken(User.name)], useFactory: (usersModel: Model<User>) => ({ adminJsOptions: { rootPath: '/admin', resources: [ { resource: usersModel, options: { navigation: { name: null, icon: '', }, properties: { email: { isTitle: false, position: 1, }, name: { isTitle: true, }, _id: { isVisible: { list: false }, }, password: { isVisible: false, }, }, actions: { edit: { isAccessible: isAdmin }, delete: { isAccessible: isAdmin }, new: { isAccessible: isAdmin }, show: { isAccessible: isAdmin, }, list: { isAccessible: isAdmin }, custom_delete: { actionType: 'record', icon: 'TrashCan', guard: 'doYouReallyWantToDoThis', variant: 'danger', before: before, after: after, handler: async (request, response, context) => { const user = context.record; await usersModel.findOne({_id: request.params.id}); console.log('custom handler!!!'); return { record: user.toJSON(context.currentAdmin), }; } }, }, }, }, ], }, auth: { authenticate: async (email, password) => { const user = await usersModel.findOne({ email: email }); if (user) { const matched = user.password === password; if (matched && user.role === 'ADMIN') { return user.readOnlyData; } } return null; }, cookieName: 'cookie-test', cookiePassword: 'test', }, }), }), ], }) export class AdminModule {} const isAdmin = ({ currentAdmin }) => currentAdmin && currentAdmin.role === 'ADMIN'; resource 코드 분리 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 import * as AdminJSMongoose from '@adminjs/mongoose'; import { AdminModule as AdminBroModule } from '@adminjs/nestjs'; import { Module } from '@nestjs/common'; import { getModelToken } from '@nestjs/mongoose'; import AdminJS from 'adminjs'; import { Model } from 'mongoose'; import { UsersModule } from 'src/users/users.module'; import { User } from 'src/users/users.schema'; import { after, before } from './hooks/users.hooks'; import { userResource } from './resources/users.resource'; AdminJS.registerAdapter(AdminJSMongoose); @Module({ imports: [ AdminBroModule.createAdminAsync({ imports: [UsersModule], inject: [getModelToken(User.name)], useFactory: (usersModel: Model<User>) => ({ adminJsOptions: { rootPath: '/admin', resources: [ userResource ], }, auth: { authenticate: async (email, password) => { const user = await usersModel.findOne({ email: email }); if (user) { const matched = user.password === password; if (matched && user.role === 'ADMIN') { return user.readOnlyData; } } return null; }, cookieName: 'cookie-test', cookiePassword: 'test', }, }), }), ], }) export class AdminModule {} const isAdmin = ({ currentAdmin }) => currentAdmin && currentAdmin.role === 'ADMIN'; 함수로 만들어 파라미터로 넘겨주는 방법밖에 없을까요???
-
미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
해당 코드를 실행했을때 어떤 문제점이 있을지 생각해보는 문제였습니다.. 어떤 문제가 발생할지 가늠이 안됩니다....
코드는 다음과 같습니다 해당 코드를받고 어떤 문제점이 생길 수 있는지 파악해보라 하셨는데... 모른채 넘어갔습니다. 혼자라도 알아보려고 노력했는데 잘 모르겠습니다. 도움을 주실 수 있을까요.. let number = 0; const times = 100; function sleep() { return new Promise((resolve) => setTimeout(resolve, Math.random() * 5)); } async function adder() { for (let i = 0; i < times; i++) { await sleep(); let read = number; read = read + 1; await sleep(); number = read; } } async function subber() { for (let i = 0; i < times; i++) { await sleep(); let read = number; read = read - 1; await sleep(); number = read; } } async function main() { console.log("Started with", number); await Promise.all([ adder(), subber(), ]); console.log("Ended with", number); } main() .then(() => console.log("All done")) .catch((err) => console.error(err));
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 기본 강의
mongoDB 의 모델의 역할
module.exports = mongoose.model('User', userSchema) 와 같은 스키마를 감싼 모델(mongodb의 컬렉션)을 이용하면const user = new User(req.body) 와 같이 req 정보를 이용하여 모델 인스턴스를 만든다음에이걸 다시 save 메서드를 통해 mongoDB의 User(users) 컬렉션에 저장할 수도 있고,User.findOne({ email: req.body.email }, (err, user) => { //요청한 email이 db정보 안에 있을 때 해당 db정보를 담은 객체 user 가 생성된다. if (!user) { return res.json({ loginSuccess: false, message: "제공된 이메일에 해당하는 유저가 없습니다." }) }와 같이 User(users)컬렉션에 접근(조회)하여 해당 객체를 찾을 수도 있다. 결론: mongoDB의 모델은 모델 인스턴스를 생성할 수도 있고, DB에 접근하여 값을 조회,수정 등등을 할 수 있다라고 이해했는데 맞는 것인지 궁금합니다. 역할이 다양한게 조금 헷갈려서 질문드립니다.
-
미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
next()가 없는 (불필요한) 경우에도, middleware 함수라고 볼 수 있나요??
안녕하세요~ 좋은 강의 넘 잘 듣고 있습니다~ 감사합니다 :) 이 에러 핸들링을 하는 함수를 middleware라고 언급해주셨는데, 저는 조금 헷갈려서 질문 드립니다! app.use((req: express.Request, res: express.Response, next: express.NextFunction) => { console.log('this is error middleware'); res.send({ error: '404 not found error' }); }); 미들웨어는 하려는 일의 중간에서, 개발자가 원하는 무언가를 할 수 있도록 하는 것을 말하는거니까 express 에서는 next() 가 있는 경우를 middleware 로 본다 는 것으로 이해했습니다. 그런데 위 코드는 다음으로 넘기는 것 없이 바로 404를 반환해서, next가 꼭 필요하지 않은 것 같은데... 이 경우에도 이 함수를 middleware 함수라고 볼 수 있나요~?
-
미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
http-exception.filter.ts 파일 내용 중 질문이 있습니다.
const error = exception.getResponse() as | string | { error: string; statusCode: number; message: string | string[] }; 강의 중에 http-exception.filter.ts 파일에서 error 변수를 위와 같이 할당을 하는데 as | string 뒤에 있는 타입을 { error: string, statusCode: number; message: string | string[] };로 받는데 객체의 속성들을 특별하게 넣어준 이유가 있나요? 단순히 { error: string }로만 처리해도 다른 속성 값들이 자동으로 들어오기 때문에 출력할 때는 문제가 없는 것 같은데 정확한 타입을 제공하기 위해서 라던가 등 특별한 이유가 있는지 궁금합니다.
-
미해결mongoDB 기초부터 실무까지(feat. Node.js)
블로그 생성 후 응답 값에 id, _id 둘 다 나오는 이유가 궁금해요~
안녕하세요. 강사님! 강의 너무나 유익하게 잘 보고 있습니다! 오늘 궁금한건 아래와 같아요. 블로그 post api 응답값에 _id 와 id가 모두 나오는데 각각 로직의 어느 부분에서 나오게 된건지 궁금해요! { "blog": { "title": "Handmade title", "content": "Handmade content", "isLive": true, "user": { "_id": "615bd756d21a61989f312d16", "username": "Bettye.Prosacco595", "name": { "first": "Marley", "last": "Leuschke" } }, "_id": "615ea22b706c8fa1ae8e3950", "createdAt": "2021-10-07T07:30:51.545Z", "updatedAt": "2021-10-07T07:30:51.545Z", "__v": 0, "id": "615ea22b706c8fa1ae8e3950" } }
-
미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
버퍼와 스트림의 차이
버퍼가 일정한 크기로 모아뒀다가 다 채워지면 전송하는 방식이고, 스트림은 일정한 크기의 데이터를 지속적으로 전달하는 방식이라고 이해했습니다. 그렇다면, 버퍼의 크기를 작게하면 스트림의 기능을 하고 스트림의 highWaterMark를 크게하면 버퍼와 같은 기능을 하는건가요??
-
미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
mongodb에서 Auto_incement 기능을 사용할수 있는 방법이 있나요?
저는 이번 강의로 mongoose는 처음 이용해 보는데요. DB 의 _id 값에 SQL의 Auto_increment 이용하듯이 Int 타입으로 값을 넣고 싶은데요 어떻게 해야 하나요? express로 설계할 때에는 추가적으로 Collection을 만들고 거기에서 DB에 입력할때 값을 받아오고 숫자를 늘려주는 방법으로 했었는데요.. Nest로 설계하기는 약간 복잡한거 같아서 질문드립니다.
-
미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
소켓 연결관련 질문입니다.
강의에서 socket.id는 계속 유지되다가 연결이 끊기거나 새로고침되면 바뀐다고 나오는데요 즉, 새로고침하면 소켓연결이 끊긴다는 뜻인데 이걸 막을 방법이 있나요? 예를 들어서 제가 웹 상에서 멀티플레이가 가능한 카드게임을 구현한다고 하면 게임 플레이 도중 사용자가 실수로 새로고침을 누르면 끊겨버릴텐데 이런 상황에서는 어떤식으로 처리를 하나요? 또 질문이 하나 있는데 강의와는 조금 벗어난 질문이긴한데.. 소켓연결에 더해서 redis까지 이용해서 만들어보려고 하는데 구글에 nestjs redis 이렇게 검색하면 나오는 공식문서가 Microservice 어쩌고 하면서 redis랑 같이 나오더라구요. 제가 구현하고 싶은 기능은 웹상에서 방을 만들고, 사용자들이 해당 방에 들어가면 사용자들의 정보를 redis에 담고 redis pub/sub과 소켓을 이용하여 같은 방안에 사용자들끼리 통신하는 그런걸 만들어보고 싶은데 이 경우에 공식문서에 나와있는 Microservice.. 를 쓰면 되는게 맞는건지 잘 모르겠어서 질문드립니다.
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 기본 강의
User.js의 save() 및 _id 관련 질문 드립니다.
친절한 답변에 항상 감사드립니다. 아래 질문이 두가지 있습니다. 바쁘시겠지만 확인 하시면 답변 부탁 드리겠습니다. 1. User.js의 아래의 save()는 실제 DB에 저장을 하는겁니까 user.save(function(err, user) { if(err) return cb(err) cb(null, user) }) 2. User.js의 generateToken에서 아래와 같이 user._id의 값을 불러왔는데 이 값은 this 객체에는 설정이 안된 값인데 DB에서 자동으로 생성된 값을 어떻게 불러올수 있는지요? var user = this; var token = jwt.sign(user._id.toHexString(), 'secretToken');
-
해결됨따라하며 배우는 TDD 개발 [2023.11 업데이트]
mysql import 에러
mysql을 사용하여 진행 중인 프로젝트가 있는데 tdd를 적용해보려고 합니다. controllers/subscription.js const db = require('../routes/database.js'); exports.subscribeCalendar=()=>{}; 컨트롤러 코드는 위와 같고 test/unit/subscription.test.js const subscriptionController=require("../../controllers/subscription") describe("캘린더 구독",()=>{ test("subscribeCalendar 함수가 있을 겁니다.",()=>{ // subscriptionController.subscribeCalendar의 타입은 함수다. expect(typeof subscriptionController.subscribeCalendar).toBe("function") }) }) 테스트 코드는 위와 같은데 컨트롤러에서 db를 임포트 하기 전에는 에러가 안 떴는데 임포트 한 후에 테스트는 통과하지만 아래와 같은 에러 메시지가 뜹니다. 검색해보니 단위테스트 할 때는 db 관련 코드는 넣지 말라고 하는데 그 원인일까요? ReferenceError: You are trying to `import` a file after the Jest environment has been torn down. 이미 mysql로 진행 중이라 몽구스로 변경하기가 어려운데 에러메시지 무시하면 될까요..?
-
해결됨탄탄한 백엔드 NestJS, 기초부터 심화까지
프론트 코드는 어디서 받나요?
https://github.com/amamov/teaching-nestjs-a-to-z 에 있는 frontend 디렉토리가 프론트코드인가요?
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 기본 강의
postman 오류
강의와 모든부분 동일하게 작성했고 postman 에서 send 클릭시에 계속해서 오류가 발생하는데 어떤부분이 문제인지 모르겠습니다 ㅠㅠ GITHUB 주소 첨부합니다 ( React-Node ) 폴더 https://github.com/OHYUNBEOM index.js User.js postman 오류 visual studio code 오류
-
해결됨mongoDB 기초부터 실무까지(feat. Node.js)
age가 숫자인지 다시 체크하는 이유
안녕하세요! 좋은 강의 잘 듣고 있습니다. 다름이 아니라 질문이 있어 글을 남깁니다. 이미 User.js에서 age: Number로 설정해두었기 때문에 숫자 외의 것이 들어온다면 catch문에서 제대로 에러 처리가 될 것 같은데, 따로 라우트 내에서 age가 숫자인지 아닌지를 다시 체크하는 이유가 궁금합니다. 감사합니다!
-
미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
Filter도 결국 middleware에서 처리할 수 있을거 같은데 나누는 이유가 있을까요?
Filter도 결국 middleware에서 처리할 수 있을거 같은데 나누는 이유가 있을까요?