묻고 답해요
140만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결탄탄한 백엔드 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'; 함수로 만들어 파라미터로 넘겨주는 방법밖에 없을까요???
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 유튜브 사이트 만들기
MongoParseError
MongDB 연결하는 도중 port 5000번! 은 출력되나 그 밑에 MongDB연결도중 parser에러가 납니다.
-
미해결[리뉴얼] 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 함수라고 볼 수 있나요~?
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 쇼핑몰 사이트 만들기[전체 리뉴얼]
선생님! product 테이블에 컬럼이 일부 저장이 안됩니다
선생님! 강의 너무 유용해요 잘 듣고있습니다~ 그런데 마지막 부분에서 디비에 저장되는 컬럼에 body에서 보내준 내용 일부분만 저장이 되고 있습니다. 로그를 찍어봐도 body에는 정상적으로 잘 들어갔는데 오류 메세지도 없고.. 왜 이럴까요? 제가 누락한 부분이 있을까요..?? >client/UploadProductPage.js const submitHandler = e => { console.log("upload to DB"); e.preventDefault(); if (!TitleValue || !Description || !Price || !Continent || !Images) { return alert("모든 값을 넣어주세요."); } const body = { //로그인 된 사람의 ID를 넣어줘야 한다. writer: props.user.userData._id, title: TitleValue, description: Description, price: Price, images: Images, continents: Continent }; Axios.post("/api/product", body).then(res => { if (res.data.success) { alert("상품 업로드에 성공했습니다."); console.log(body); props.history.push("/"); } else { alert("상품 업로드에 실패했습니다."); } }); }; >server/model/Product.js const mongoose = require("mongoose"); const Schema = mongoose.Schema; const productSchema = mongoose.Schema( { writer: { type: Schema.Types.ObjectId, ref: "User" }, title: { type: String, maxlength: 50 }, description: { type: String }, price: { type: Number, default: 0 }, images: { type: Array, default: [] }, sold: { type: Number, maxlength: 100, default: 0 }, continents: { type: Number, default: 1 }, views: { type: Number, default: 0 } }, { timestamps: true } ); productSchema.index( { title: "text", description: "text" }, { weights: { title: 5, description: 1 } } ); const Product = mongoose.model("Product", productSchema); module.exports = { Product }; >console.log 결과 >mongo DB 저장 결과 바쁘시겠지만 알려주시면 감사하겠습니다!
-
미해결탄탄한 백엔드 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에서 처리할 수 있을거 같은데 나누는 이유가 있을까요?
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 기본 강의
mongoose.connect 질문
user 부분 쪽에 오류 표시가 뜨는데 이유가 뭘까요? 그리고 저 상태로 로컬호스트에 연결하여 띄우면 콘솔창에 아무내용이 뜨지 않습니다 ㅠㅠ
-
미해결처음하는 MongoDB(몽고DB) 와 NoSQL(빅데이터) 데이터베이스 부트캠프 [입문부터 활용까지] (업데이트)
Mac M1에서도 mongodb 설치할 수 있는 튜터리얼 만들어주시면 감사하겠습니다.
Mac M1에서도 mongodb 설치할 수 있는 튜터리얼 만들어주시면 감사하겠습니다. 선생님 강의 보면서 재미있게 따라하고 있는 수강생입니다. 그런데 제가 mac M1으로 바꾸었는데 그대로 따라할려고 하다보니 path도 꼬이고 유튜브나 블로그에서도 약간 중구난방식으로 설명이 된거 같아서 선생님께서 mac유저 앞으로 향후 M1사용자가 증가될 것이 자명하기 때문에 추가로 튜터리얼 작성해주시면 감사하겠습니다. 다른 설명 따라할려고 하는데 터미널쪽하고는 전혀 친하지 않아서... ㅜㅜ
-
미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
프로젝트 때 이런 이유로 mongoDB를 사용하였는데 알맞게 사용한게 맞을까요?
안녕하세요 제로초님! 같이 프로젝트를 진행한 동기가 말하기를 "서비스에 join 작업이 많은 데이터의 반복적인 요청이 많을때에는 lazy loading 이슈가 있을 수 있기 때문에 mongoDB를 사용하는게 좋다" 고 하는데... 이게 무슨 말인지 잘 모르겠습니다. mysql에서 join한 데이터를 반복적으로 조회하는게 lazy loading 이슈가 있을 수 있다는 건 이해가 되지만, mogoDB도 mongoose의 populate를 사용하기 때문에 똑같이 lazy loading 이슈가 있을 수 있는거 아닌가요?