172만명의 커뮤니티!! 함께 토론해봐요.
해결됨
Windows 소켓 프로그래밍 입문에서 고성능 서버까지!
클라이언트가 만약 소켓 연결을 정상 종료하지 않고 프로그램을 끄게 되는 경우 예컨데 정전으로 인해 클라이언트 PC가 종료됐다면 서버는 알턱이 없으니 결국 TimeOut을 체크해서 서버가 연결을 종료해야할 것 같은데 맞을까요? 제 생각엔 위와 같은 흐름으로 진행되고 다른 방법은 떠오르지 않는데 혹시 대응할 수 있는 방법이 있을까요?
hard worker
2023-08-08T16:12:03.805Z
댓글 2
좋아요 0
조회수 450
해결됨
실리콘밸리 엔지니어가 가르치는 파이썬 장고 웹프로그래밍
민감한 URL 이라든지 환경변수를 통해 사용하고 싶은게 있을 때 강사님께서는 어떻게 관리하시는지 궁금합니다. 그냥 UNIX 환경에서 export url = http://example.com 이런식으로 하고 os 모듈을 통해 쓰고있는데, 더 보안상 좋은 방법이 있을까요?
python django bootstrap rest-api drf
2023-08-08T05:27:01.353Z
댓글 1
좋아요 1
조회수 398
미해결
Slack 클론 코딩[실시간 채팅 with React]
강의 7:40부근 webpack.config.ts 파일 72번째 라인 devServer: { historyApiFallback: true, // react router port: 3090, devMiddleware: { publicPath: '/dist/' }, static: { directory: path.resolve(__dirname) }, }, 이부분 추가하시면 될것같습니다. static: { directory: path.resolve(__dirname) }
react 웹팩 typescript socket.io babel 클론코딩
Sherry
2023-08-08T05:11:13.331Z
댓글 1
좋아요 2
조회수 720
해결됨
[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
무료/프리미엄 고르고 도메인주소 입력하면 밑에 화면에 주소와 타입 비밀키가 표시되지 않습니다. 로그는 계속 이렇게만 뜨고, 워크벤치 들어가보면 키는 보입니다. 키가 발급은 되었는데, 브라우저로 못 띄우는 것 같다고 판단했습니다. 어떤 부분을 확인해봐야 될까요?
node.js mysql mongodb express typescript socket.io jwt
ysm6514
2023-08-07T20:30:22.584Z
댓글 1
좋아요 0
조회수 613
미해결
Slack 클론 코딩[실시간 채팅 with React]
로그인 및 인증,인가(세션,jwt둘다 사용), 게시판(이미지포함), 댓글, 소켓채팅 정도의 기능을 구현하여 테스트 코드와 docker로 띄워서 CI/CD까지 구현하려고 합니다. 상태랑 로직 관리를 useReducer, React Context API, React Query, redux, graphql 정도로 생각하고 있는데 어떤걸로 하는게 좋을까요?!
react 웹팩 typescript socket.io babel 클론코딩
최영철
2023-08-07T12:24:17.637Z
댓글 1
좋아요 0
조회수 334
미해결
Slack 클론 코딩[실시간 채팅 with React]
mac os에서 mysql을 homebrew로 사용중입니다. root계정의 비밀번호 설정 완료했습니다. back 환경설정에서 문제를 겪고있습니다. cd back으로 경로 이동후 npm i로 node 모듈 설치 성공후에 .env파일 구성(비밀번호 맞음), npx sequelize db:create 명령어 입력시 아래와 같은 에러가 발생합니다. -- 에러메세지 시작 Sequelize CLI [Node: 16.18.0, CLI: 6.6.0, ORM: 6.28.0] Loaded configuration file "config/config.js". Using environment "development". ERROR: Failed to create schema directory 'sleact' (errno: 2 - No such file or directory) -- 에러메세지 종료 -- .env파일 시작 COOKIE_SECRET =sleactcookie MYSQL_PASSWORD =kaadal -- .env파일 종료 --config.js 시작 require('dotenv'). config (); module.exports = { "development": { "username": "root", "password": process.env.MYSQL_PASSWORD, "database": "sleact", "host": "127.0.0.1", "dialect": "mysql" }, "test": { "username": "root", "password": process.env.MYSQL_PASSWORD, "database": "sleact", "host": "127.0.0.1", "dialect": "mysql" }, "production": { "username": "root", "password": process.env.MYSQL_PASSWORD, "database": "sleact", "host": "127.0.0.1", "dialect": "mysql" } } -- config.js 종료 이상입니다.
react 웹팩 typescript socket.io babel 클론코딩
Sherry
2023-08-07T09:33:59.644Z
댓글 1
좋아요 0
조회수 514
해결됨
[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
서버쪽에선 socket.on("join", (data) => { socket.join(data); // 방 참가 socket.to(data).emit("join", { user: "system", chat: `${socket.request.session.color}님이 입장하셨습니다.`, }); }); 이렇게 room계층 소켓으로 연결했고, 해당 room으로 join이벤트를 보냈는데 브라우저 쪽에선 const socket = io.connect("http://localhost:8005/chat", { path: "/socket.io", }); socket.emit("join", new URL(location).pathname.split("/").at(-1)); socket.on("join", function (data) {...} /chat 네임스페이스 계층 소켓으로 밖에 연결하지 못했는데 어떻게 해당 room계층으로 온 join이벤트인지 구별하는 게 가능한지 궁금합니다. room계층보다 상위인 네임스페이스 계층에 연결했으니 어느 room으로 오든 네임스페이스만 같으면 모든 이벤트를 다 감지하게 되는 것 아닌가요?
node.js mysql mongodb express typescript socket.io jwt
roider2316
2023-08-04T14:27:24.052Z
댓글 1
좋아요 0
조회수 300
해결됨
[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
메인화면으로가는 버튼을 빠르게 반복해서 누르면 로딩중만 나오길래 개발자모드에서 network를 보면 (pending)이렇게 나오면서 응답을 못하는상태인데 왜 그러는걸까요? 모든 함수에서 mysql에 연결하고 쿼리문 사용할때 async/await 사용하고있습니다. 로그인 미들웨어는 promise로 사용하고있는데 정확히 어떤점때문에 이러한 오류가 발생하는지 모르겠습니다. 저pending 오류를 어떻게해야 해결이 될까요?
node.js mysql mongodb express typescript socket.io jwt
밈몀묘
2023-08-03T07:27:37.769Z
댓글 1
좋아요 0
조회수 1457
미해결
[신규 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)
안녕하세요! 강사님 강의를 끝까지 다 수강하였습니다. 너무 도움이 많이 되었습니다. 감사합니다. 부동산 매물 강의에 대한 공지를 보고 메일로 문의 드렸는데 아직 피드백이 오지 않아 이렇게 질문글로 문의를 드리게 되었습니다! 메일 문의 한 번만 확인 부탁드립니다. 감사합니다!
2023-08-02T02:47:21.688Z
댓글 1
좋아요 0
조회수 275
미해결
[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
안녕하세요 선생님 ! 강의 정말 잘 보고 있습니다 ! 다름이 아니라 현재 Node Js 교과서를 참고해서 웹 프로젝트를 진행 중입니다. AWS를 이용해 lightsail과 도메인을 구입해 실제 배포를 하려 하는데요. 큰 프로젝트가 아니라 사용자가 100~200명쯤 되는 블라인드 매칭 서비스입니다. 무료로 진행하는 프로그램이라 큰 걱정은 없지만, 실제 서버 배포를 함에 있어 15장에 나오는 서비스 운영을 위한 패키지 만으로 보안이 가능할까 걱정이 돼서 글을 작성합니다. 추가 적으로 추천하시는 패키지들이 있으시면 추천 받고 싶습니다 !
node.js mysql mongodb express typescript socket.io jwt
qrwrqrwrer
2023-08-01T10:22:37.699Z
댓글 1
좋아요 0
조회수 424
해결됨
Slack 클론 코딩[실시간 채팅 with React]
MDN의 가이드에 따라 DragNDrop 코드를 작성하는데 파일을 가져오기 위한 코드인 event.dataTransfer.items 에서 아래와 같은 오류가 발생햇습니다. 'DataTransferItemList' 형식은 배열 형식이 아닙니다.ts(2461) MDN DataTransfer: items 속성 가이드에서는 목록을 반환하고 항목이없어도 빈목록을 반환한다고 되어있고 MDN DataTransferItemList 타입 가이드에서 객체라고 명시되어 있던데 개별항목에는 [ ]표기법으로 접근할수 있다는걸로 보아 event.dataTransfer.items의 타입은 리스트가 아닌 오브젝트에 숫자를 KEY로 값을 넣어놓은 형태인가요?? 아님 또다른 타입인건가요? 코드 function dropHandler(ev: React.DragEvent<HTMLDivElement>): void { console.log('File(s) dropped'); // Prevent default behavior (Prevent file from being opened) ev.preventDefault(); if (ev.dataTransfer.items) { // Use DataTransferItemList interface to access the file(s) [...ev.dataTransfer.items].forEach((item, i) => { // If dropped items aren't files, reject them if (item.kind === 'file') { const file = item.getAsFile(); if (file) { console.log(`… file[${i}].name = ${file.name}`); } } }); } else { // Use DataTransfer interface to access the file(s) const files = ev.dataTransfer.files; [...files].forEach((file, i) => { console.log(`… file[${i}].name = ${file.name}`); }); } } MDN DragNDrop가이드 https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/File_drag_and_drop MDN DataTransfer: items 속성 가이드 https://developer.mozilla.org/ko/docs/Web/API/DataTransfer/items MDN DataTransferItemList 타입 가이드 https://developer.mozilla.org/en-US/docs/Web/API/DataTransferItemList
react 웹팩 typescript socket.io babel 클론코딩
최석우
2023-07-31T03:26:48.546Z
댓글 1
좋아요 0
조회수 715
미해결
퀀트 투자를 위한 주식 자동매매 봇 만들기 Part 1
예제 코드를 파이참을 실행해서 어느 프로그램 경로에다가 어떤식으로 연결해야 실행이 되는지 잘 모르겠습니다. 현재 예제 코드가 실행이 잘 안되서요
헌준
2023-07-31T02:24:01.787Z
댓글 2
좋아요 0
조회수 542
해결됨
[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
Promise.reject를 쓰는 경우가 아니라면 바로 반환하거나 Promise객체를 사용해서 반환하거나 똑같은 것 같은데 크게 상관없나요?
node.js mysql mongodb express typescript socket.io jwt
roider2316
2023-07-29T14:58:15.477Z
댓글 1
좋아요 0
조회수 349
해결됨
Slack 클론 코딩[실시간 채팅 with React]
만약 Page의 단위를 5로 잡아서 최초 랜더링한 페이지가 스크롤이 되지않는다면 onScroll 이벤트가 발생하지 않으니 setSize 이벤트도 발생할수 없습니다. 이렇게 최초 데이터의 개수가 모자라서 이벤트 자체가 발생하지 않으면 별개의 이벤트로 scroll이 가능할때까지 페이지를 불러와야 하는데 좋은 방법이 잇는가요? 페이지를 5개로 잡을떄 페이지를 20개로 잡을떄 참조 코드 import ChatBox from '@components/ChatBox'; import ChatList from '@components/ChatList'; import useInput from '@hooks/useInput'; import { Header, Container } from '@pages/DirectMessage/styles'; import fetcher from '@utils/fetcher'; import makeSection from '@utils/makeSection'; import axios from 'axios'; import gravatar from 'gravatar'; import React, { FC, FormEventHandler, useCallback, useEffect, useRef, useState } from 'react'; import Scrollbars from 'react-custom-scrollbars-2'; import { useParams } from 'react-router'; import useSWR from 'swr'; import useSWRInfinite from 'swr/infinite'; const PAGE_SIZE = 5; const DirectMessage: FC = () => { const { workspace, id } = useParams(); const { data: myData } = useSWR<IUser, false>('/api/users', fetcher); const { data: userData } = useSWR<IUser, false>(`/api/workspaces/${workspace}/users/${id}`, fetcher); const [chat, onChangeChat, setChat] = useInput(''); // const scrollbarRef = useRef(null); const { data: chatData, mutate: mutateChat, setSize, } = useSWRInfinite<IDM[]>( (index) => `/api/workspaces/${workspace}/dms/${id}/chats?perPage=${PAGE_SIZE}&page=${index + 1}`, fetcher, ); const isEmpty = chatData?.[0]?.length === 0; const isReachingEnd = isEmpty || (chatData && chatData[chatData.length - 1]?.length < PAGE_SIZE); const chatSection = makeSection(chatData ? [...chatData].flat().reverse() : []); const onSubmitForm = useCallback<FormEventHandler>( (event) => { event.preventDefault(); if (!chat || !chat?.trim()) { return; } axios .post(`/api/workspaces/${workspace}/dms/${id}/chats`, { content: chat, }) .then(() => { mutateChat(); setChat(''); }) .catch(console.error); console.log('제출'); }, [chat, id, mutateChat, setChat, workspace], ); const scrollbarRef = useRef<Scrollbars>(null); return !userData || !myData || !chatData ? null : ( <Container> <Header> <img src={gravatar.url(userData.email, { s: '24px', d: 'retro' })} alt={userData.nickname} /> <span>{userData.nickname}</span> </Header> <ChatList chatSections={chatSection} isEmpty={isEmpty} isReachingEnd={isReachingEnd} setSize={setSize} ref={scrollbarRef} /> <ChatBox onSubmitForm={onSubmitForm} chat={chat} onChangeChat={onChangeChat} placeholder={`Message ${userData.nickname}`} otherData={[userData]} /> </Container> ); }; export default DirectMessage; import Chat from '@components/Chat'; import { ChatZone, Section, StickyHeader } from '@components/ChatList/styles'; import React, { FC, MutableRefObject, forwardRef, useCallback } from 'react'; import { Scrollbars, positionValues } from 'react-custom-scrollbars-2'; interface Props { chatSections: { [key: string]: (IDM | IChat)[] }; isEmpty: boolean; isReachingEnd?: boolean; setSize: (f: (size: number) => number) => Promise<(IDM | IChat)[][] | undefined>; } const ChatList = forwardRef<Scrollbars, Props>(({ chatSections, isReachingEnd, isEmpty, setSize }, scrollRef) => { const onScroll = useCallback( (values: positionValues) => { if (values.scrollTop === 0 && !isReachingEnd) { setSize((size) => size + 1).then(() => { const current = (scrollRef as MutableRefObject<Scrollbars>)?.current; if (current) { current.scrollTop(current.getScrollHeight() - values.scrollHeight); } }); } }, [isReachingEnd, scrollRef, setSize], ); return ( <ChatZone> <Scrollbars autoHide ref={scrollRef} onScrollFrame={onScroll}> {Object.entries(chatSections).map(([dateData, chatData]) => ( <Section className={`section-${dateData}`} key={dateData}> <StickyHeader> <button>{dateData}</button> </StickyHeader> {chatData.map((chat) => ( <Chat key={chat.id} data={chat} /> ))} </Section> ))} </Scrollbars> </ChatZone> ); }); export default ChatList;
react 웹팩 typescript socket.io babel 클론코딩
최석우
2023-07-29T14:45:15.143Z
댓글 1
좋아요 0
조회수 562
해결됨
Slack 클론 코딩[실시간 채팅 with React]
원본값을 유지하기위해 concat을 사용하셧는데 지금 같은 1차원 배열일때는 문제가 없지만 2차원 배열일 경우 해당 배열이 다쪼개져서 1차원 배열이 되는걸로 알고있습니다 그래서 저는 원본을 유지할때 스프레드 문법을 사용하는데 concat이 더 좋은경우도 있나요? 두가지 방법을 다 알려주시긴 하셧는데 차이점이 잇는가 궁금합니다. 예시상황 const chatData = [[1, 2], [3, 4], [5, 6]]; [].concat(...chatData).reverse() => [6, 5, 4, 3, 2, 1] [...chatData].reverse() => [[5, 6], [3, 4], [1, 2]]
react 웹팩 typescript socket.io babel 클론코딩
최석우
2023-07-29T12:19:44.268Z
댓글 1
좋아요 0
조회수 443
해결됨
Slack 클론 코딩[실시간 채팅 with React]
기존 윈도우 스크롤바의 경우 스크롤바가 width를 잡아먹어 의도햇던 디자인이 찌그러 지는경우가 있어서 고민이엿습니다. 이번 강의에서 알려주신 react-custom-scrollbars 의경우 width를 잡아먹지 않고 내부에 생성되는걸로 확인되는데 vw,vh를 100%로 잡은 최상위 레이아웃을 만들고 react-custom-scrollbars 를 추가한뒤 그 자식으로 기존 코드들을 옮기려 합니다. 이때 문제가 될만한 이슈 또는 더 나은 방법이 잇을까요?
react 웹팩 typescript socket.io babel 클론코딩
최석우
2023-07-29T07:59:31.044Z
댓글 1
좋아요 0
조회수 718
미해결
[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
강의에서 알려주신대로 MySQL 설치 및 정상적으로 비밀번호도 설정하였습니다. 그리고, workbench 및 콘솔로도 잘 실습하였고요. (*Table 세팅 등) 그런데, 컴퓨터를 껐다가 재부팅했더니 MySQL 로그인이 안됩니다. 패스워드도 정상적으로 다 입력하였으나, 계속 오류 메세지가 나와서 cmd에 접속해 현재 mysql이 사용중인 프로세스 id가 컴퓨터 재부팅 전에 설정되었던 pid와 다름을 확인하였고, 어쩔 수 없이 컴퓨터에 설치된 MySQL 프로그램 삭제 후 재설치하면서 임시방편으로 문제해결하긴 했습니다. 혹시 몰라서 또 다시 컴퓨터를 재부팅한 이후 MySQL pid를 보았는데, 또 바뀌어 있더라고요. 그럼.... 컴퓨터를 매번 재부팅할 때마다 MySQL 프로그램을 계속 삭제했다가 재설치를 해야하나요?ㅜ
node.js mysql mongodb express typescript socket.io jwt
Json
2023-07-29T05:04:54.500Z
댓글 1
좋아요 0
조회수 716
미해결
[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
안녕하세요 강사님, 현재 Lightsail에서 배포를 진행하며 $ sudo NODE_ENV=production PORT=80 pm2 start server.js -i 0 명령어 작성후 $ sudo pm2 monit으로 확인해 보니 아래와 같은 오류가 발생합니다. KakaoStrategy 모듈을 못찾는다는데 passport-kakao 1.0.0 버전으로 npm i를 했었습니다. 어떤게 문제인걸까요..? 로컬에서는 문제없이 잘 돌아갔습니다. package.json 입니다. { ... "dependencies": { "@aws-sdk/client-s3": "^3.377.0", "bcrypt": "^5.1.0", "connect-redis": "^4.0.4", "cookie-parser": "^1.4.6", "cors": "^2.8.5", "cross-env": "^7.0.3", "csurf": "^1.11.0", "dotenv": "^16.3.1", "express": "^4.18.2", "express-session": "^1.17.3", "helmet": "^7.0.0", "hpp": "^0.2.3", "morgan": "^1.10.0", "multer": "^1.4.5-lts.1", "multer-s3": "^3.0.1", "mysql2": "^3.4.2", "nunjucks": "^3.2.4", "passport": "^0.6.0", "passport-kakao": "1.0.0", "passport-local": "^1.0.0", "pm2": "^5.3.0", "redis": "^3.0.2", "sanitize-html": "^2.11.0", "sequelize": "^6.32.1", "sequelize-cli": "^6.6.1", "winston": "^3.10.0" }, "devDependencies": { "nodemon": "^2.0.22" } } passport > kakaoStrategy.js 부분입니다. const passport = require('passport'); const KakaoStrategy = require('passport-kakao').Strategy; const User = require('../models/user'); module.exports = () => { passport.use(new KakaoStrategy({ clientID: process.env.KAKAO_ID, callbackURL: '/auth/kakao/callback', }, async (accessToken, refreshToken, profile, done) => { // accessToken, refreshToken은 카카오 api를 호출하는데 사용되나, 여기선 사용하지 않음 console.log('kakao profile', profile); try { const exUser = await User.findOne({ where: { snsId: profile.id, provider: 'kakao' }, }); if (exUser) { //login done(null, exUser); } else { //join const newUser = await User.create({ email: profile._json?.kakao_account?.email, // 이 구조가 자주 바뀌므로, profile을 console.log를 통해 계속 확인하자 nick: profile.displayName, snsId: profile.id, provider: 'kakao', }); done(null, newUser); } } catch (error) { console.error(error); done(error); } })); };
node.js mysql mongodb express typescript socket.io jwt
rlawjddn4706
2023-07-28T09:55:20.871Z
댓글 2
좋아요 0
조회수 436
해결됨
[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
이전 강의에서 만든 서버에서 서버로 요청하는 nodecat서버를 프록시 서버라고 봐도 되나요? 브라우저에서 nodecat과 같은 도메인인 localhost:4000/myposts 요청을 보냈고 nodecat 서버가 이를 받아 nodebird서버로 localhost:8002/v1/post/my 요청을 보냈으니 이게 뭐 http-proxy-middleware같은 패키지를 써서 따로 구현해야 하는 프록시 서버랑 뭐가 다른지 모르겠습니다.
node.js mysql mongodb express typescript socket.io jwt
roider2316
2023-07-28T07:05:54.602Z
댓글 1
좋아요 0
조회수 264
해결됨
[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
이전 강의에서 갑자기 axios.defaults.headers.origin을 넣은 것이 이해가 되지 않았었는데 이번 강의에서 corsWhenDomainMatches 미들웨어에 사용하기 위해 넣은 것이라 봐도 되나요? 근데 axios.defaults.headers.origin = process.env.ORIGIN; 코드를 주석처리해도 Origin 헤더는 정상적으로 찍히던데 저게 있는 것과 없는 것과 뭔 차이인가요?
node.js mysql mongodb express typescript socket.io jwt
roider2316
2023-07-28T05:17:57.102Z
댓글 1
좋아요 1
조회수 414