묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
passport.authenticate('local/kakao') 관련 질문
안녕하세요routes/auth.js에서 passport.authenticate('local' / 'kakao')로 로그인전략을 실행할 때auth.js에서는 local(), kakao()가 있는 passport/index.js를 require 한 적이 없는데도 실행되는 걸 보고 질문드립니다.passport 모듈 내에 passport폴더를 자동으로 인식하는 기능이 있는건가요?
-
해결됨Slack 클론 코딩[실시간 채팅 with React]
Workspaces.map 함수가 제대로 작동하지 않습니다 ㅠ
워크스페이스에서 user정보들이 전부 불러오지 않고..하나씩만 담겨져서 보여집니다 ㅠㅠ아무리 찾아봐도 해결을 하지못해서 글을 남깁니다.프록시는 설정되어있습니다.무엇이 문제일까요.. Workspace 코드입니다.import { Channels, Chats, Header, ProfileImg, RightMenu, WorkspaceWrapper, WorkspaceName, MenuScroll, Workspaces, ProfileModal, LogOutButton, WorkspaceButton, AddButton, } from '@layouts/Workspace/styles'; import React, { FC, useCallback, useState } from 'react'; import useSWR from 'swr'; import fetcher from '@utils/fetcher'; import axios from 'axios'; import Menu from '@components/Menu'; import Modal from '@components/Modal'; import { IUser } from '@typings/db'; import { Redirect, Switch, Route, Link } from 'react-router-dom'; import loadable from '@loadable/component'; import gravatar from 'gravatar'; const Channel = loadable(() => import('@pages/Channel')); const DirectMessage = loadable(() => import('@pages/DirectMessage')); const Workspace: FC = ({ children }) => { const [showUserMenu, setShowUserMenu] = useState(false); const { data: userData, error, mutate, } = useSWR<IUser | false>('/api/users', fetcher, { dedupingInterval: 2000, }); const onLogOut = useCallback(() => { axios .post('/api/users/logout', null, { withCredentials: true, }) .then(() => { mutate(); }); }, []); const onClickUserProfile = useCallback(() => { setShowUserMenu((prev) => !prev); }, []); // 토글 함수 if (!userData) { return <Redirect to="/login" />; } return ( <div> <Header> <RightMenu> <span onClick={onClickUserProfile}> <ProfileImg src={gravatar.url(userData.email, { s: '28px', d: 'retro' })} alt={userData.nickname} /> {showUserMenu && ( <Menu style={{ right: 0, top: 38 }} show={showUserMenu} onCloseModal={onClickUserProfile}> <ProfileModal> <img src={gravatar.url(userData.email, { s: '36px', d: 'retro' })} alt={userData.nickname} /> <div> <span id="profile-name">{userData.nickname}</span> <span id="profile-active">Active</span> </div> </ProfileModal> <LogOutButton onClick={onLogOut}>로그아웃</LogOutButton> </Menu> )} </span> </RightMenu> </Header> <WorkspaceWrapper> <Workspaces> {userData?.Workspaces.map((ws) => { return ( <Link key={ws.id} to={`/workspace/${1234}/channel/일반`}> <WorkspaceButton>{ws.name.slice(0, 1).toUpperCase()}</WorkspaceButton> </Link> ); })} {/* <AddButton onClick={onClickCreateWorkspace}>+</AddButton> */} </Workspaces> <Channels> <WorkspaceName>Sleact</WorkspaceName> <MenuScroll>menuscroll</MenuScroll> </Channels> <Chats> <Switch> <Route path="/workspace/channel" component={Channel} /> <Route path="/workspace/dm" component={DirectMessage} /> </Switch> </Chats> </WorkspaceWrapper> </div> ); }; export default Workspace;
-
해결됨[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
const config = require('../config/config')[env];를 es모듈로 불러오는 방법
안녕하세요 자꾸 글 작성했다 지웠다 해서 죄송합니다.직접 검색해보고 해결해보려했는데 안되어서 다시 남깁니다. 7.6장 model/index.js 파일중에서const config = require('../config/config')[env];수업에 나왔던 이 코드와 동일하게 동작하게끔 es모듈 방식으로 import하는 코드를 작성하려 합니다import cfg from '../config/config.json' assert { type : 'json' } const config = cfg[env]; 이렇게 작성해 보았는데(node:10404) ExperimentalWarning: Importing JSON modules is an experimental feature and might change at any time(Use node --trace-warnings ... to show where the warning was created)이런 경고가 뜨고, 무시하고 app.js를 실행하면 서버가 실행되긴 하는데 책&예제코드에 나오는 메시지와는 다른 아래와 같은 메시지가 나옵니다.Executing (default): SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME = 'users' AND TABLE_SCHEMA = 'nodejs'Executing (default): SHOW INDEX FROM users FROM nodejsExecuting (default): SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME = 'comments' AND TABLE_SCHEMA = 'nodejs'Executing (default): SHOW INDEX FROM comments FROM nodejs 어떻게 해야 es모듈에서도 동일하게 동작하게끔 할 수 있는지 궁금합니다.
-
해결됨Windows 소켓 프로그래밍 입문에서 고성능 서버까지!
IP주소 개수, Listen과 Accept 사이에서 연결 요청
TCP 에코 서버 제작 : 클라이언트 연결 받기 및 통신 수업에서포트 바인드 코드 설명에서 NIC이 여러개 있으면 IP주소도 여러개 있을 수 있다고 하셨는데, NIC의 개수와 비례해서 IP주소도 늘어나는 것인가요? 예를들어 NIC이 3개이면 IP주소도 항상 3개인 것인지. 아니면 그 이상 또는 이하로 IP주소를 가져도 상관 없는건지 궁금합니다.Listen 코드 설명에서 1번 클라이언트가 접속을 요청하고 Accept 처리까지 끝나서 ~~하는 과정에서 다른 클라이언트가 접속을 요청하면 요청 자체가 날아가서 접속이 안된다 라고 하셨는데, 이때 날아가는 요청은 1번 클라이언트의 요청인지 아니면 다른 클라이언트의 요청인지 궁금합니다.
-
미해결Slack 클론 코딩[실시간 채팅 with React]
[공유] react-mention 항상 커서 위에 나오게 수정
이전 질문을 보면 react-mention 추천이 커서 아래로 나온다고 해서 공식 문서를 확인해봤습니다.결론적으로는 forceSuggestionsAboveCursor을 사용하면 됩니다. 해당 내용은 제로초님 sleact 레파지토리에 pull request 하였습니다.allowSuggestionsAboveCursor는 아래 공간이 부족하면 위에 배치가 '가능'하도록, 즉 워크스페이스 사람이 적으면 아래로 배치forceSuggestionsAboveCursor는 항상 위로 배치allowSuggestionsAboveCursor: Renders the SuggestionList above the cursor if there is not enough space belowforceSuggestionsAboveCursor: Forces the SuggestionList to be rendered above the cursor
-
미해결[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
수업 내용에 대해 질문드립니다.
안녕하세요http.createServer(async (req, res) => { try { if (req.method === 'GET') { if (req.url === '/') { const data = await fs.readFile(path.join(__dirname, 'restFront.html')); res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' }); return res.end(data); } else if (req.url === '/about') { const data = await fs.readFile(path.join(__dirname, 'about.html')); res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' }); return res.end(data); } else if (req.url === '/users') { res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' }); return res.end(JSON.stringify(users)); } // /도 /about도 /users도 아니면 try { const data = await fs.readFile(path.join(__dirname, req.url)); return res.end(data); } catch (err) { // 주소에 해당하는 라우트를 못 찾았다는 404 Not Found error 발생 } restFront.js , restFront.css 등을 받아오는 try 부분에서강의에는 const data = await fs.readFile(`.${req.url)`);로 수업하셨는데책과 깃헙예제에는 const data = await fs.readFile(path.join(__dirname, req.url)); 로 되어있어가지구요1. .${req.url}에서 백틱과 .은 꼭 쓰여야 하는건지랑2. 책의 예제코드에서 __dirname의 경로는 restServer.js가 있는 위치가 기준이 되는건지 질문드립니다. else if (req.method === 'POST') { if (req.url === '/user') { let body = ''; // 요청의 body를 stream 형식으로 받음 req.on('data', (data) => { body += data; }); // 요청의 body를 다 받은 후 실행됨 return req.on('end', () => { console.log('POST 본문(Body):', body); const { name } = JSON.parse(body); const id = Date.now(); users[id] = name; res.writeHead(201, { 'Content-Type': 'text/plain; charset=utf-8' }); res.end('등록 성공'); }); } } return req.on('end', () =>{}) 에서 'end'라는 이벤트가 어느 부분에서 발생해서 저기 들어가는건지도 궁금합니다.
-
미해결Slack 클론 코딩[실시간 채팅 with React]
채팅대화에서 시간이 중복될경우 안보이게 하는방법 문의.
안녕하세요. 복습중에 새로운 기능을 넣으려고 하는데 생각보다 잘 안되네요. 카카오톡 메신저처럼. 동일한 시간에 보낸 카톡시간을 안보이게 하려고합니다.서버에서 가져온 현재시간값과 이전 대화시간값(chat.createdAt) 을 비교하면 될것같은데useState 를 이용할때는 무한로딩으로 막혓고 (setState 로 현재값 저장) useRef 를 사용해서 값을 저장하여 비교하고 싶은데. 항상 현재시간값만 이용하게 되네요.어떻게 접근하는것이 좋을까요.
-
해결됨Windows 소켓 프로그래밍 입문에서 고성능 서버까지!
동기/비동기
블록킹/논블록킹 IO동기/비동기 IO이 두가지가 다른 의미로 쓰이는거 같은데항상 어떤 차이가 있는지 잘 모르겠습니다.혹시 차이점 위주로 설명해주실수 있으실까요..
-
해결됨Windows 소켓 프로그래밍 입문에서 고성능 서버까지!
같은 공유기 내 서버 실습
같은 공유기 와이파이에서 무선으로 연결된 노트북 2대로 실습하려면따로 설정해줘야 되는것이 궁금합니다.
-
미해결[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
새로고침 한번에 클러스터 2개 종료
안녕하세요?setTimeout 대신 setImmediate를 적용해 요청이 발생하는 즉시 워커가 종료되게 해보았는데요, 이 경우엔 워커가 한번에 두개씩 종료됩니다.DevTool - network 창에 보이는 요청은 새로고침 1회당 GET 1회씩인데 왜 이러는지 궁금합니다! const cluster = require('cluster'); const http = require('http'); const numCPUs = require('os').cpus().length; if (cluster.isMaster) { console.log(`마스터 프로세스 아이디 : ${process.pid}`); // CPU 갯수만큼 워커를 생산 for (let i=0; i < numCPUs; i++ ){ cluster.fork(); } //워커가 종료되었을 때 cluster.on('exit', (worker, code, signal) => { console.log(`${worker.process.pid}번 워커가 종료되었습니다.`); console.log('code', code, `signal`, signal); }); } else { // 워커들이 포트에서 대기 http.createServer((req, res) => { res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8'}); res.write('<h1>Hello Node!'); res.end('<p>Hello Cluster!</p>'); setImmediate(()=> { process.exit(1); }); }).listen(8086); console.log(`${process.pid}번 워커 실행`); };
-
미해결Slack 클론 코딩[실시간 채팅 with React]
빌드 후 이미지url
nest 백엔드까지 같이 사서 들었는데요 몇일 고민을 해봤는데 해결이 안되서 질문 올립니다.강의에서 말씀하신것처럼 프론트 빌드 한 것을 백엔드 public 폴더 안에 넣었습니다. 파일구조는 back/public안에 dist폴더랑 index.html이렇게 넣었습니다. 먼저 첫번째 질문은 프론트 따로 백엔드 따로 로컬에서 돌릴때는 이렇게 뜨고 제대로 실행이 되는데 백엔드안에 빌드한 내용물을 넣고 로컬에서 돌린 후 이미지를 업로드 하면 액박이 뜹니다. 그래서 주소를 보았는데 위에 있는 백엔드에서 안가져오고 다른 주소에서 가지고 오는데 그 주소가.. http:다른 사람이 배포한 주소/upload\사진.jpg로 뜨더라구요 사진을 올리고 싶은데 다른 사람이 배포한 주소가 떠서 일단 이렇게 설명 드립니다 그래서 결과적으로 프론트에서 proxy를 3095로 했는데 백엔드로 돌릴때도 3095로 되어야 되는데 안됩니다! (이미지 빼고는 다 됩니다)두번째 질문은 이미지빼고는 다 잘 되서 일단 배포를 한번 해봤는데요 이런 에러메세지가 뜹니다. 네트워크를 살펴봤을 때는 app.js에는 200으로 잘 가지고 왔구요 타입문제인줄 알고 이렇게도 해봤는데도 안되서 찾아보니 경로문제인거같은데 .. 경로는 제대로 한거같은데 왜 안되는지 모르겠습니다 (파일구조)
-
미해결[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
비동기 방식에서의 에러처리
안녕하세요! 어제 유투브에서도 질문드렸었는데 잘 이해가 가지 않아 다시 질문드립니다.184p server1-1.jsconst http = require('http'); const server = http.createServer((req, res) => { res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' }); res.write('<h1>Hello Node!</h1>'); res.end('<p>Hello Server!</p>'); }); server.listen(8080); server.on('listening', () => { console.log('8080번 포트에서 서버 대기 중입니다!'); }); server.on('error', (error) => { console.error(error); });어제 이 부분 에러처리를 try/catch로 하면 안되는건지 질문드렸었는데 server함수가 비동기로 진행되는거라 try/catch 적용하면 안된다고 답변받았었습니다. 186p server2.jsconst http = require('http'); const fs = require('fs').promises; http.createServer(async (req, res) => { try { const data = await fs.readFile('./server2.html'); res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' }); res.end(data); } catch (err) { console.error(err); res.writeHead(500, { 'Content-Type': 'text/plain; charset=utf-8' }); res.end(err.message); } }) .listen(8081, () => { console.log('8081번 포트에서 서버 대기 중입니다!'); });그런데 바로 뒤에서 async를 사용하여 비동기임이 확실한데도 try/catch로 에러처리를 하신 부분이 나와서 잘 이해가 안갑니다..뒷부분에서는 왜 try/catch를 적용해도 되는건지 궁금합니다!
-
미해결Slack 클론 코딩[실시간 채팅 with React]
라이브러리 질문
이렇게 코드 옆에 설명 나오게 하고싶은데 어떻게 해야될까요?
-
해결됨Windows 소켓 프로그래밍 입문에서 고성능 서버까지!
크로스케이블에 관해
두 개의 피시를 연결할 때 꼭 크로스케이블이 있어야 하는지 질문입니다. 그냥 랜 케이블을 꽂아도 랜카드에서 신호를 알아서 바꿔 인식할텐데, 크로스케이블로만 구현할 수 있는 장애 상황같은게 있는지 궁금하네요.
-
미해결[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
라우트 분리 및 템플릿 엔진 사용법 강의
안녕하세요. 이전 강의와 강의 교안과는 다르게, 개정3판 강의에서는 라우트분리 및 템플릿엔진 사용법과 관련된 강의가 빠져있더라고요.혹시 해당 강의들에 대해서 이번 개정판에서는 더 이상 학습하지 않아도 괜찮기 때문에 강의 내용에서 빠진 것 일까요?매번 좋은 강의로 감사합니다.
-
미해결Slack 클론 코딩[실시간 채팅 with React]
DM 전송 테스트시 500 에러
안녕하세요. 해당 강의에서 제가 DM을 확인하려고 전송을 해봤는데 500에러가 나오지만, 다시 데이터를 불러오면 DM 자체는 서버로 잘 간거처럼 나와서요. payload도 정상적으로 보내진거 같은데, 혹시 제가 api 추상화쪽을 잘못했나 싶지만,, 그런거 같지는 않아서 고민하다가 이렇게 질문을 올려보아요 ! 이게 해당 handleSubmut 코드와 API 추상화 코드입니다. 한번 봐주시면 감사하겠습니다.
-
미해결Slack 클론 코딩[실시간 채팅 with React]
onDragLeave 이벤트
onDragOver를 통해서 화면 안으로 파일을 넣으면 업로드라는 문자가 뜨는데 다시 파일을 밖으로 꺼내도 업로드! 라는 화면이 계속 떠 있더라구요 그래서 onDragLeave를 사용하여 dragover를 false로 만들어줘서 해결하긴 했는데, onDragOver만 사용했을 때는 업로드! 화면이 깜빡이지 않았는데, onDragLeave를 같이 사용하니까 업로드! 화면이 마우스를 움직일 때마다 깜빡이면서 채팅창 부분이 리렌더링 되는데, 더 효율적인 방법이 있을까요??const DM = () => { const [dragOver, setDragOver] = useState(false); const onDragOver = useCallback((e: any) => { e.preventDefault(); setDragOver(true); }, []); const onDragLeave = useCallback((e: any) => { e.preventDefault(); setDragOver(false); }, []); if (!userData || !myData) { return null; } // useSWRInfinite가 2차원 배열이기 때문에 1차원 배열로 만들어서 reverse를 해준다. const chatSections = makeSection(chatData ? [...chatData].flat().reverse() : []); return ( <Container onDrop={onDrop} onDragOver={onDragOver} onDragLeave={onDragLeave}> <Header> <img src={gravatar.url(userData.email, { s: '24px', d: 'retro' })} alt={userData.nickname} /> <span>{userData.nickname}</span> </Header> {/* chatData => 채팅을 DM에 표시해주기 위함 */} <ChatList chatSections={chatSections} ref={scrollbarRef} isEmpty={isEmpty} isReachingEnd={isReachingEnd} setSize={setSize} /> <ChatBox chat={chat} onChangeChat={onChangeChat} onSubmitForm={onSubmitForm} /> {dragOVer && <DragOVer>업로드!</DragOVer>} </Container> ); }; export default DM;코드는 해당되는 부분만 적었습니다.
-
해결됨Windows 소켓 프로그래밍 입문에서 고성능 서버까지!
특정 이벤트 발생시 호출되는 함수 관련 질문이 있어요!!
강사님.Lookup table 구조로 가게되면 함수 포인터에예를 들어 함수 포인터 배열 이름이 func 일 때,특정 이벤트가 발생할 때, 핸들러 함수에서 내부 로직으로 func[0](); 이런식으로 호출하는 구조도 많이 사용되는 구조인지요 ? ... 그러니까 인덱스 값을 함수가 주입받는 구조가 아니라, 특정 이벤트에 실행될 핸들러 함수에인덱스를 하드코딩해 놓는 구조도 많이 사용되는 구조인지요 ? 예를들면 파일 전송 요청이오면 핸들러에 func[0](); 이런식으로요!!! 제가 프로그래밍 능력이 부족해서 설명이 부족해서 글이 길어졌네요 ...;;
-
미해결Slack 클론 코딩[실시간 채팅 with React]
프론트엔드 세팅하기
안녕하세요~강의 초기 세팅에서 제로초님 git에서 clone하여 내려받아 백엔드 DB연결까지 했습니다. 그런데 프론트엔드 세팅하기 강좌에서는 어떻게 진행해야할지 모르겠네요.. 이미 깃에 완성된 모든 코드가 내려받아진상태라서 당황스러워서 질문글을 찾아보니..setting폴더의 ts부터 시작하라는 글을 보았는데요..저는 너무 많은 폴더가 중복되어있는게 복잡하고 정리가 안된 느낌이라서... 삭제하고싶은데요그럼 alecture 폴더와, front-js폴더, front-rq, fornt 폴더를 삭제 한 뒤 setting>ts 폴더만 상위로 꺼내와 alecture로 이름을 변경해서 작업을 진행하면 되나요?또 삭제해도 되는 폴더가 있으면 알려주세요..처음부터 시작하고싶지만 백엔드 부분때문에 안될꺼같아서 참 난감합니다..
-
미해결[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
AWS에서 MongoDB 설치
안녕하세요.15장을 듣다가 궁금해서 Node와 관련이 없는 질문을 드립니다.MySQL은 RDS를 쓴다고 하셨는데 MongoDB를 EC2에서 분리하여서 설치하는 서비스는 무엇인가요?감사합니다.