묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결이미지 관리 풀스택(feat. Node.js, React, MongoDB, AWS)
Router.use 두번째 파라미터 ImageRouter : undefined 전달 오류
Router.use() requires a middleware function but got a undefined export require 경로 확인 잘 했는데 왜 발생할까요...?
-
미해결[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
LightSail 실행 중 오류 질문드립니다!
4:47경 sudo dpkg -i mysql-apt-config_0.8.23-1_all.deb 입력시 이렇게 강의와 다른 화면이 나왔었습니다. 또한영상 5:20에서 명령어를 입력했더니 에러가 나면서 비밀번호를 입력하는 화면이 나오지 않아 더 이상 진행하지 못하고 있습니다.
-
미해결[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
RedisStore 사용법 질문
connect-redis 8.0.1 최신버젼을 사용중입니다. 강의 내용도 해보고 깃헙 코드도 참조해서 해봐도 오류나서 connect-redis 공식문서 읽어보았더니const { RedisStore } = require('connect-redis'); const sessionOption = { resave: false, saveUninitialized: false, secret: process.env.COOKIE_SECRET, cookie: { httpOnly: true, secure: false, }, store: new RedisStore({ client: redisClient }), //저장소의 기본값: 메모리 }이렇게 사용해야 할 것 같습니다. 그렇게 되면 session객체를 const RedisStore = require('connect-redis')(session); 이렇게 넘겨줄 필요는 없는 걸까요?? 그리고 8.0.1 공식문서에서 말하는대로 해도 괜찮을까요?
-
해결됨React, Node.js, MongoDB로 만드는 나만의 회사 웹사이트: 완벽 가이드
req.cookies.token == undefined 현상
logout을 해보니 400BadRequest:이미 로그아웃 됨 상태가 지속됩니다. console.log(req.cookies.token); 출력해보니 undefined 라고 출력됩니다. 쿠키를 제대로 읽지 못하는것 같은데 왜 이런 현상이 뜨는지 궁금합니다.. const express = require("express"); const router = express.Router(); const bcrypt = require("bcrypt"); const User = require("../models/User"); const axios = require("axios"); const jwt = require("jsonwebtoken"); router.post("/signup", async (req, res) => { try { const { username, password } = req.body; const existingUser = await User.findOne({ username }); if (existingUser) { return res.status(400).json({ message: "이미 존재하는 사용자입니다." }); } const hashedPassword = await bcrypt.hash(password, 10); const user = new User({ username, password: hashedPassword, }); await user.save(); res.status(201).json({ message: "회원가입이 완료되었습니다." }); } catch (error) { res.status(500).json({ message: "서버 오류가 발생했습니다." }); console.log(error); } }); router.post("/login", async (req, res) => { try { const { username, password } = req.body; const user = await User.findOne({ username }).select("+password"); //왜인지 password가 select되지 않아서 추가함 if (!user) { return res.status(401).json({ message: "존재하지 않는 사용자입니다." }); } if (!user.isActive) { return res.status(401).json({ message: "비활성화된 사용자입니다." }); } if (user.isLoggedIn == true) { return res.status(401).json({ message: "이미 접속 중인 사용자입니다." }); } const isValidPassword = await bcrypt.compare(password, user.password); //비밀번호 비교 if (!isValidPassword) { user.failedLoginAttempts += 1; user.lastLoginAttempt = new Date(); if (user.failedLoginAttempts >= 5) { user.isActive = false; //다섯번 틀리면 계정 비활성화 ㅋㅋ await user.save(); return res.status(401).json({ message: "비밀번호를 5회 이상 틀려 계정이 비활성화되었습니다.", }); } await user.save(); return res.status(401).json({ message: "비밀번호가 일치하지 않습니다.", remainingAttempts: 5 - user.failedLoginAttempts, }); } user.failedLoginAttempts = 0; user.lastLoginAttempt = new Date(); user.isLoggedIn = true; try { const response = await axios.get("https://api.ipify.org?format=json"); //공공장소 사용금지요 const ipAddress = response.data.ip; //한번 정제함 user.lastLoginIp = ipAddress; } catch (error) { console.log("IP 주소를 가져오는데 실패했습니다: ", error.message); } await user.save(); const token = jwt.sign( { userId: user._id, username: user.username }, process.env.JWT_SECRET, { expiresIn: "24h" } //토큰 만료는 24시간 ); console.log(token); //오 된다 res.cookie("token", token, { httpOnly: true, //자바스크립트에서 쿠키 접근 불가 secure: "production", //https에서만 쿠키 전송 sameSite: "strict", //같은 사이트에서만 쿠키 전송 maxAge: 24 * 60 * 60 * 1000, //24시간 }); const userWithoutPassword = user.toObject(); //구글링 해보니 이렇게 하면 문서 타입을 일반 객체로 변환할 수 있다고 한다 delete userWithoutPassword.password; //보안때문에 비밀번호는 삭제할 수 있다고 한다 res.json({ user: userWithoutPassword }); } catch (error) { console.log("서버 오류: ", error); res.status(500).json({ message: "서버 오류가 발생했습니다." }); } }); router.post("/logout", async (req, res) => { console.log(req.cookies.token); try { const token = req.cookies.token; if (!token) { return res.status(400).json({ message: "이미 로그아웃된 상태입니다." }); } try { const decoded = jwt.verify(token, process.env.JWT_SECRET); const user = await User.findById(decoded.userId); if (user) { user.isLoggedIn = false; await user.save(); } } catch (error) { console.log("토큰 검증 오류: ", error.message); } res.clearCookie("token", { httpOnly: true, secure: "production", sameSite: "strict", }); res.json({ message: "로그아웃되었습니다." }); } catch (error) { console.log("로그아웃 오류: ", error.message); res.status(500).json({ message: "서버 오류가 발생했습니다." }); } }); router.delete("/delete/:userId", async (req, res) => { try { const user = await User.findByIdAndDelete(req.params.userId); if (!user) { return res.status(404).json({ message: "사용자를 찾을 수 없습니다." }); } res.json({ message: "사용자가 성공적으로 삭제되었습니다." }); } catch (error) { res.status(500).json({ message: "서버 오류가 발생했습니다." }); } }); module.exports = router;
-
미해결코로나맵 개발자가 알려주는 React + Express로 지도서비스 만들기 (Typescript)
수업자료 다운로드 시 빈폴더만 나오네요
안녕하세요. 오늘 강의 결제하고 수업 소스코드를 다운받았는데 아무 것도 없는 빈 폴더만 나왔습니다. 그래서 질문 답변에 나왔던 구글 드라이브 링크로 들어가려고 해도 엑세스 거부됨만 나와서 전혀 진행이 돼지 않는 상황이네요...
-
미해결[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
윈도우 파일탐색기 주소창에서 cmd를 입력할 경우 해당 경로로 바로 cmd를 열 수 있습니다.
윈도우 파일탐색기 주소창에서 cmd를 입력할 경우 해당 경로로 바로 cmd를 열 수 있습니다. 중요한건 아닌데 혹시 도움 되실까 싶어서 올려봅니다. (강의 마지막에 cmd를 따로 열어서 직접 경로를 찾아가고 있는데 시간을 단축시킬 수 있습니다)
-
해결됨React, Node.js, MongoDB로 만드는 나만의 회사 웹사이트: 완벽 가이드
npm run dev 무한로딩
npm run dev를 통해 frontend 폴더에서 다음과같이 정상적으로 실행이 되었습니다.다만, 막상 해당 경로로 접속하면 우외같이 무한로딩에 빠져서 아무것도 뜨지 않습니다.F12 개발자도구로 봐도 어떠한 콘솔에러메시지도 없습니다. 어떻게 해결해야 할까요?
-
미해결기획자님 이 정도 웹 개발은 배워보면 어떨까요? [이론+실습]
StockList 만들기 중 404 ERR_BAD_REQUEST 에러
StockList 만들기 중 404 ERR_BAD_REQUEST 에러 발생하여한참 구글링 해보다가 아래의 방법으로 해결하였습니다.혹시 같은 에러 있으신 분들 참고하세요 보안 이슈땜에 proxy 설정 필요합니다. 1) npm install http-proxy-middleware --save2) src 폴더에 setupProxy.js 생성 후아래 내용 복사const { createProxyMiddleware } = require("http-proxy-middleware"); module.exports = function (app) { app.use( "/api", createProxyMiddleware({ target: "http://localhost:3000", changeOrigin: true, }) );};
-
미해결기획자님 이 정도 웹 개발은 배워보면 어떨까요? [이론+실습]
home 화면에 불러와지지 않아요!
BMI 계산기 프로그램 완성하기 5:14 ~APP.vue 파일에서<router-view></router-view>main.js 파일에서 import { createApp } from 'vue' import App from './App.vue' import router from './router' createApp(App) .use(router) .mount('#app') 작성하면 선생님이 보여주신 거처럼 하단에 HomePage가 나와야 하는데저는 HomePage 가 나오지 않아요.BMI를 눌러도 BMI 가 나오지 않습니다. BMI를 클릭하면BMI를 클릭하면 path만 변경되지 다른 반응이 나오지 않습니다.코드는 제가 직접 적진 않았고 선생님이 작성해준 코드를 그대로 넣었습니다index mainapp.vue
-
해결됨React, Node.js, MongoDB로 만드는 나만의 회사 웹사이트: 완벽 가이드
코드 다시 만져보면서 추가질문입니다.
문의하기에서 접수 완료 후 (현재 기본 로컬~문의완료되었습니다.) 알럿 뜨는거 저번에 배운 게시글 처럼 넣어서 이쁘게 꾸며도 사용상 문제없는거 맞죠?만약에 참고할만한 알럿 다른 라이브러리나 깃허브 같은건 보통 실무에서 어떻게 참조하나요?몽고DB랑 AWS_S3로 저희가 이미지 및 데이터를 저장하잖아요, 그럼 실무에서는 그냥 도메인 및 호스팅만 따로 구매해서 넘겨드리고 사용 하시면 된다고 하면서 넘겨드리고, 몽고DB 및 AWS_S3는 제가 한 계정(제 개발계정)에 같이 폴더만 나눠서 관리하는 식으로 많이하나요? 궁금합니다.
-
해결됨React, Node.js, MongoDB로 만드는 나만의 회사 웹사이트: 완벽 가이드
로그인 문제에 대해서
안녕하세요 선생님강의 잘들었습니다! 마지막 영어 및 다국어 변환만 들으면 벌써 완강이네요 감사합니다 :)전체적으로 코드를 보다가 궁금증이 있어서 문의합니다.코드 정리하면서 기능 하나씩 눌러보니, 1. 회원가입 페이지가 저희 프로젝트에는 없어서 몽고db에 수동으로 등록하면서 진행했잖아요 이부분을 회원가입으로 어떻게 연동하는지 궁금합니다.2. 실무에서 사용하는 강의라고 하셨는데 이부분은 실무에서 저희 프로젝트처럼 진행하면 어떻게 설명하는지도 궁금합니다. "로그인이 다른곳에되어있습니다"이렇게 어드민에 뜨게 되면 지금이야 저희가 몽고db에 들어가서 false로 변경하면 들어가지긴하나, 이걸 온라인에 배포한다고 하면 어떻게 실무적으로 처리하나요??
-
해결됨React, Node.js, MongoDB로 만드는 나만의 회사 웹사이트: 완벽 가이드
노션 파일 중에서 contact input내용이 전부 날아가있네요
코드가 조금 다른 것 같습니다.2. 문의하기 누르면 어드민으로 문의하기가 넘어가고 어드민으로 들어왔을때 확인 되어야하는거죠?제가 놓친 것 같아서 깃허브를 찾아서 복사 붙여넣기하니,아래 처럼 뜹니다.저희가 이걸 배운적이 있나요? 있다면 어느 부분인지 궁금합니다.import ContactLocale from "../../Locale/Contact.json"; [plugin:vite:import-analysis] Failed to resolve import "../../Locale/Contact.json" from "src/Page/Contact/Contact.jsx". Does the file exist?C:/Users/shin/Desktop/company_website/frontend/src/Page/Contact/Contact.jsx:4:2619 | import { motion } from "framer-motion"; 20 | import axios from "axios"; 21 | import ContactLocale from "../../Locale/Contact.json"; | ^ 22 | const Contact = () => { 23 | _s();
-
해결됨React, Node.js, MongoDB로 만드는 나만의 회사 웹사이트: 완벽 가이드
매번 새로운 프로젝트를 실행할 때 cmd 설정문의
저희가 수업진행하면서 프론트엔드,백엔드에 많은 npm으로 설치하잖아요. 이런 라이브러리들을 매번 새로운 프로젝트마다설정해야할까요??비슷한 작업을 뽑아낸다고할때 기존 지금 폴더를 다시 연 다음에 이미지 및 텍스트 수정할때말고 다시 비슷한 프로젝트 폴더를 만들어서 한다고 하면 반드시 다시 전부 깔아야하는거죠? ㅠㅠ
-
해결됨Azure Native로 나만의 GPT 만들기
Azure function 트러블 슈팅 건
안녕하세요 , 수강 잘 들었습니다 ㅎㅎ강의 커리큘럼을 다 수강 완료 해서 Azure function을 활용한 SaaS 방식의 서비스를 쫌더 깊게 이해하는 시간을 가졌구요 제가 지금 기존 강의 내용에 살을 더 붙여 langChain 기반으로 Rag를 적용 시켜서 개발을 완료한 상태 입니다. 근데 여기서 문제가 되는 부분이 로컬에서는 기능을 잘 수행을 하는데 agent 함수를 배포를 하게 되면 에러가 뜨는지 , 기능을 수행하지 못합니다. 서비스 버스에 메시징은 잘 쌓이는데 agent function 에서 그 메시징 리퀘스트도 받질 못하는거 보니 , 런 타임에서 에러가 난거 같은데 해당 함수 Application Insights 대쉬 보드에서 확인하려니 뭐가 뭔지 알수가 없더라구요 ... 서버 로그를 확인 하고 싶은데 혹시 어떤 방법으로 이런 트러블을 해결할수 있을까요 ...
-
해결됨React, Node.js, MongoDB로 만드는 나만의 회사 웹사이트: 완벽 가이드
선생님 잘듣고있습니다.
여기 이 강의를 다듣고 회사 및 기업 홈페이지리를만들고,1. FIREBASE 강의도 들어서 로그인 기능 더 추가하면 되는거죠?2. 결제기능도 넣고 싶은데 강의 만들 계획이 있으신가요? 있다면 언제쯤일까요? 3. 카카오지도 API 끌고와서 호갱노노나 부동산지인 같은 홈페이지도 만들어 보고싶습니다. 한국부동산원 API 이런 API를 들고와서 설정하는 방법도 알고싶어요!아마 1,2,3이 합친다면 웬만한건 다 만들 수 있지않을까요?? 감사합니다
-
해결됨MongoDB를 활용하여, 200억건 이상의 데이터 파이프라인 작성법
안녕하세요 혹시 강의하실때 진행하시는 몽고디비 버전은 몇인가요?
!
-
해결됨React, Node.js, MongoDB로 만드는 나만의 회사 웹사이트: 완벽 가이드
npm install --save @tinymce/tinymce-react 오류 입니다.
리액트 버젼이 19.0 이상이라서 안된다고하는데 리액트를 다운그레이드해야하나요??...리액트를 다운그래이드 안하고 사용하는 방법은 없을까요?
-
미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
42강 고양이끼리 소통 댓글 구현 중 Schema hasn't been registered for model 'comments' 에러 해결
async findAll() { const CommentsModel = mongoose.model('comments', CommentsSchema); const result = await this.catModel .find() .populate('comments', CommentsModel); return result; }cats.repository 파일 github에 되어있는 건 이렇게 되어있습니다. 그런데 에러 발생이유는 모르겠으나 Nest 버전 차이로 보임 constructor(@InjectModel(Cat.name) private readonly catModel: Model<Cat>) {} async findAll() { const result = await this.catModel.find().populate('comments'); return result; }위처럼 바꿔주고 cats.schema에서 ref: 'comments' => 'Comments' 변경 _CatSchema.virtual('comments', { ref: 'Comments', localField: '_id', foreignField: 'info', }); _CatSchema.set('toObject', { virtuals: true }); _CatSchema.set('toJSON', { virtuals: true }); export const CatSchema = _CatSchema; 이렇게 해주니 해결 되었습니다
-
해결됨Azure Native로 나만의 GPT 만들기
webpubsub연결 오류
강의 잘 듣고있습니다. 이번 강의에서 front와 API를 연결하는 작업 도중, 계속 마지막에 토큰까지는 잘 받아오지만 웹소켓을 못 만드는 문제가 발생했습니다. 문제가 무엇일까 계속 고민해보다가 이 강의 가장 처음에 강사님이 진행했던 =을 붙이는 작업이 떠올라 그 =을 다시 지워줬습니다. 그런데 해결이 됐습니다. 제 키에는 =가 마지막에 없더라구요... =가 있는 경우와 없는 경우가 존재하나봅니다. =의 차이가 혹시 무엇인지 알 수 있을까요? 그냥 암호의 일부분일까요?
-
미해결배달앱은 어떻게 내 주변의 맛집을 찾을까?
캐시 구현에서 Redis - MongoDB 스코프
제가 이해한 구조는 아래와 같습니다.Request -> API -> Service -> Entity Redis에서 캐시 조회 실패하면 redis에서 몽고 db collection 관련 함수를 직접 조회 하는 게 아니라 서비스로 돌아가서 서비스단에서 몽고 db collection 관련 함수를 호출하는게 맞지 않나요? 아니면 주신 코드 처럼 Entity 단에서는 서로를 호출하면서 작동하는게 맞나요?