묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
에러처리
에러처리 해줄때 app.js에 에러처리 미들웨어를 해주시는데 꼭 이 방식으로 에러 처리를 해줘야하나요? 아니면 보통 router를타고 특정 함수에서 res.status(405).json(dfsa);이렇게 하나하나 처리해주면 안되나요?
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
login 기능 구현시 cookie가 서버에서 브라우저로 전달이 안됩니다.
라이브서버를 통해서 페이지를 열고(localhost:5501)로컬서버를 통해 서버를 돌리고(localhost:3000)버튼을 클릭하면 axios요청을 통해 서버에서 set-cookie를 응답 header에 작성해주도록했습니다. 크롬 개발자도구 network 탭에서 set-cookie가 잘 들어와있는걸 확인했는데 왜 application 탭에서 확인해보니 cookie가 들어있지 않는건가요?(corsenable origin, credentials 설정과 axios.post요청에도 credentials 설정을 해줬습니다.)
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
grapnql fetchboardscount와 createboard
안녕하세요 데이터 통신 실습 중에 질문이 생겨 남깁니다. create board 실행 시 리턴값으로 number를 지정했을 때 나오는 게시물의 수와 fetchboardscount 실행 시 리턴값이 다른 이유가 궁금합니다. createboard의 리턴값도 몇 번째 게시물로 생성된 것인지 알려주므로 둘 다 게시물의 개수를 알려주는 게 아닌가요 ?
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
서버가 안열려요
코드캠프 서버가 안 열려요 실습해야 하는데
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
db가 이미 존재한다는 오류가 뜹니다
graphql 방식이 아닌 rest로 변경하면서 다시한번 복습중인데 rest의 경우 app.module.ts에서 TypeOrmModule.forRoot({})에서 synchronize: true, 가 되어있을 시 db오류가 나는데 제가 다른 것을 잘못 설정한 것인가요?
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
node. app.js 실행시 error 발생.
안녕하세요!models 구성하고, app.js 로 db import도 다 했는데, node app.js 실행하면 다음과 같은 에러 메세지가 뜹니다.Post.belongsToMany called with something that's not a subclass of Sequelize.Modelmodels에서 user, hashtag export 가 잘못된거 같아서 다 확인했는데, 문제를 못찾았습니다.어떤 부분이 잘 못된걸까요?감사합니다.
-
해결됨[리뉴얼] React로 NodeBird SNS 만들기
로그인시 LOG_IN_REQUEST 부분
이와 비슷한 문제가 많아서 참고해서 복붙도 해보면서 했는데도 해결되지 않아질문 남깁니다. 로그인 버튼을 누르면 리덕스 데브툴에이와 같이 나오고 saga가 연결이 되지 않는 거 같아요(코드 첨부)sagas/index.jsimport { all, fork } from 'redux-saga/effects'; // import postSaga from './post'; import userSaga from './user'; export default function* rootSaga() { console.log('rootSaga') yield all([ fork(userSaga), // fork(postSaga), ]); } sagas/user.jsimport { all } from "axios"; import { delay, fork, put, takeLatest } from "redux-saga/effects"; import { LOG_IN_FAILURE, LOG_IN_REQUEST, LOG_IN_SUCCESS, LOG_OUT_FAILURE, LOG_OUT_REQUEST, LOG_OUT_SUCCESS } from "../reducers/user"; // function logInApi(data) { // // 비동기 처리 함수는 일반함수로 정의 // return axios.post("api/login", data); // } // function logOutApi() { // // 비동기 처리 함수는 일반함수로 정의 // return axios.post("api/login"); // } function* logIn(action) { console.log('login') try { console.log('saga logIn'); // const result = yield call(logInApi, action.data); //요청의 결과 yield delay(1000); yield put({ type: LOG_IN_SUCCESS, data: action.data, }); } catch (err) { console.error(err); yield put({ type: LOG_IN_FAILURE, data: err.response.data, }); } } function* logOut() { console.log('login') try { // const result = yield call(logOutApi); //요청의 결과 yield delay(1000); yield put({ type: LOG_OUT_SUCCESS, }); } catch (err) { console.error(err); yield put({ type: LOG_OUT_FAILURE, data: err.response.data, }); } } function* watchLogIn() { console.log('watchLogIn') yield takeLatest(LOG_IN_REQUEST, logIn); } function* watchLogOUT() { console.log('watchLogOUT') yield takeLatest(LOG_OUT_REQUEST, logOut); } export default function* userSaga() { yield all([ fork(watchLogIn), fork(watchLogOUT) ]) } const g = watchLogIn(); console.log(g.next())sagas/posts.js import { all } from "axios"; import { delay, fork, put, takeEvery } from "redux-saga/effects"; // function addPostsApi(data) { // // 비동기 처리 함수는 일반함수로 정의 // return axios.post("api/login", data); // } function* addPosts(action) { console.log('addPosts') try { // const result = yield call(addPostsApi, action.data); //요청의 결과 yield delay(1000); yield put({ type: "ADD_POST_SUCESS", data: action.data, }); } catch (err) { yield put({ type: "ADD_POST_FAILURE", data: err.response.data, }); } } function* watchAddPost() { yield takeEvery("ADD_POST_REQUEST", addPosts); } export default function* postSaga() { yield all([fork(watchAddPost)]); } reducers/index.jsimport { HYDRATE } from "next-redux-wrapper"; import { combineReducers } from "redux"; import user from "./user"; import post from "./post"; // (이전 상태, 액션) => 다음 상태 const rootReducer = combineReducers({ index: (state = {}, action) => { switch (action.type) { case HYDRATE: console.log("HYDRATE", action); return { ...state, ...action.payload }; default: return state; } }, user, post, }); export default rootReducer; reducers/user.jsexport const initialState = { isLoggingIn: false, //로그인 시도(로딩)중 isLoggedIn: false, // 로그인된 상태 isLoggingOut: false, // 로그아웃 시도(로딩)중 me: null, //내정보 signUpData: {}, loginData: {}, }; export const LOG_IN_REQUEST = 'LOG_IN_REQUEST'; export const LOG_IN_SUCCESS = 'LOG_IN_SUCCESS'; export const LOG_IN_FAILURE = 'LOG_IN_FAILURE'; export const LOG_OUT_REQUEST = 'LOG_OUT_REQUEST'; export const LOG_OUT_SUCCESS = 'LOG_OUT_SUCCESS'; export const LOG_OUT_FAILURE = 'LOG_OUT_FAILURE'; export const loginRequestAction = (data) => ({ type: LOG_IN_REQUEST, data }); export const logOutRequestAction = () => ({ type: LOG_OUT_REQUEST, }); const user = (state = initialState, action) => { switch (action.type) { case LOG_IN_REQUEST: console.log('reducer login') return { ...state, isLoggingIn: true, }; case LOG_IN_SUCCESS: return { ...state, isLoggingIn: false, isLoggedIn: true, me: {...action.data, nickname: 'skylove1004'}, }; case LOG_IN_FAILURE: return { ...state, isLoggingIn: false, isLoggedIn: false, }; case LOG_OUT_REQUEST: return { ...state, isLoggingOut: true, }; case LOG_OUT_SUCCESS: return { ...state, isLoggingOut: false, isLoggedIn: false, me: null, }; case LOG_OUT_FAILURE: return { ...state, isLoggingOut: false, }; default: return state; } }; export const userState = (state) => state.user; export default user;reducers/post.jsexport const initialState = { mainPosts: [ { id: 1, User: { id: 1, nickname: "skyblue5030", }, content: "첫 번째 게시글 #express #react", Images: [ { src: "https://bookthumb-phinf.pstatic.net/cover/137/995/13799585.jpg?udate=20180726", }, { src: "https://gimg.gilbut.co.kr/book/BN001958/rn_view_BN001958.jpg", }, { src: "https://gimg.gilbut.co.kr/book/BN001998/rn_view_BN001998.jpg", }, ], Comments: [ { User: { nickname: "nero", }, content: "우와 개정판이 나왔군요~", }, { User: { nickname: "hero", }, content: "얼른 사고싶어요~", }, ], }, ], imagePaths: [], //이미지업로드시 추가됨 postAdded: false, }; const ADD_POST = "ADD_POST"; export const addPost = { type: ADD_POST, }; const dummyPost = { id: 2, content: "더미데이터입니다.", User: { id: 1, nickname: "제로초", }, Images: [], Comments: [], }; // 데이터를 먼저 구성, 화면은 작성한 데이터나 데이터 변경을 기준으로 구성 // 데이터 구조는 서버측과 합의해서 구성해야 나중에 수정할 일이 없음 const post = (state = initialState, action) => { switch (action.type) { case 'ADD_POST_SUCCESS': return { ...state, mainPosts: [dummyPost, ...state.mainPosts], // 데이터을 앞에 추가해서 게시글이 위로 올라가게 postAdded: true, }; default: return state; } }; export const postState = (state) => state.post; export default post; store/configureStore.js import { applyMiddleware, compose, createStore } from "redux"; import createSagaMiddleware from "redux-saga"; import { createWrapper } from "next-redux-wrapper"; import { composeWithDevTools } from "redux-devtools-extension"; import reducer from "../reducers"; import rootSaga from "../sagas"; const loggerMidddleware = ({ getState }) => (next) => (action) => { console.log({ action, getState }); return next(action); }; const configureStore = () => { const sagaMiddleware = createSagaMiddleware(); const middlewares = [sagaMiddleware, loggerMidddleware]; const enhancer = process.env.NODE_ENV === "production" ? compose(applyMiddleware(...middlewares)) : composeWithDevTools(applyMiddleware(...middlewares)); const store = createStore(reducer, enhancer); store.sagaTask = sagaMiddleware.run(rootSaga); return store; }; const wrapper = createWrapper(configureStore, { debug: process.env.NODE_ENV === "development", }); export default wrapper;
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
로그아웃 하고 로그인 할 때 좋아요 기능 실행되는 문제
안녕하세요 제로초님! 게시글 좋아요 부분 듣고 다시 작성해보고 있는데처음 로딩 시에는 좋아요 버튼 눌렀을 때 로그인 하지 않은 상태면 에러 메시지가 잘 나오는데 ( 로그인 안 하면 좋아요 못 누르게)첫 번째 문제는 로그인 했다가 로그아웃을 한 뒤에 좋아요 버튼을 누르면 화면에는 변화가 없지만 리덕스에는 LIKE_POST_REQUEST -> LIKE_POST_SUCCESS가 되어서 이전에 로그인했던 사용자의 아이디가 LIKERS에 들어갑니다.// middlewares.js exports.isLoggedIn = (req, res, next) => { if (req.isAuthenticated()) { next(); } else { res.status(401).send('로그인이 필요합니다.'); } }여기 middlewares에 콘솔을 띄어보니 로그인 했다가 로그아웃을 한 상태에서 버튼을 누르면 401에러 부분이 아니라 if ( req.isAuthenticated()) 부분이 실행됩니다.!! // 에러 메시지 출력부분 PostCard.js// PostCard.js const { removePostLoading, likePostError } = useSelector((state) => state.post); useEffect(() => { if (likePostError) { alert(likePostError); } }, [likePostError]);// routes/user.js - 로그아웃 부분router.post('/logout', isLoggedIn, (req, res, next) => { req.logout((err) => { if (err) { return next(err); } }); req.session.destroy(); res.send('ok'); });
-
미해결비전공자를 위한 진짜 입문 올인원 개발 부트캠프
질문있어요.
setting.jason이 그냥 비어있던데 강사님처럼 똑같이 타이핑 후 3줄을 적어야하나요? 아니면 3줄만 입력하면 되나요?강사님처럼 똑같이 입력해야한다면, 3줄 중 마지막 한줄이 중복되는데 어떻게 하나요?
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
nodejs express에서 type(commonjs,module) 관련 질문
서버작동을 위한 node app.js를 실행할때에 dotenv를 require, import를 하면서 문의점이 발생했습니다. //server.js import { creatApp } from "./app.js"; import database from "./models/database.js"; const startServer = async () => { try { await database; const app = creatApp(); const PORT = process.env.PORT; app.listen(PORT, () => { console.log(`server is listening on ${PORT}👌`); }); } catch (err) { console.log(`Failed server connect❌`); database.destroy(); } }; startServer(); //database.js import { createConnection } from "typeorm"; import dotenv from "dotenv"; dotenv.config(); const database = createConnection({ type: process.env.DB_CONNECTION, host: process.env.DB_HOST, username: process.env.DB_USERNAME, password: process.env.DB_PASSWORD, port: process.env.DB_PORT, database: process.env.DB_DATABASE, }); export default database; 이렇게 진행하면 정상적으로 서버가 정상적으로 작동하지만 database.js에서의 dotenv import 부분을 require방식으로 server.js에 옮겨놓으면 에러가 발생합니다.근본적으로 commonJS(require)방식과 module(import)방식에 대해서 dotenv를 불러올때에 require를 쓰면 server.js에 적용할때는 정상적으로 작동하는데 import를 똑같은상황에서 적용하려면 왜 database.js로 넘어가야하는지 그게 궁금해졌습니다!require와 import를 해올 때 전반적으로는 rquire는 동기적이고 import비동기적인 성질(?)때문이라고 하기에 영향이 있는건지.. 근본적인 이해가 되지 않아서요..ㅠㅜ 도움 부탁드리겠습니다 ㅠㅜ!!!!
-
해결됨비전공자를 위한 진짜 입문 올인원 개발 부트캠프
섹션1~12 중에 객체지향 개념이 쓰인 적이 있나요?
간단히라도 알려주시면 감사하겠습니다
-
미해결비전공자를 위한 진짜 입문 올인원 개발 부트캠프
http://localhost:8080/products적용 시 상품목안뜨는분들 참고하세요
.get("http://localhost:8080/products")로 바꾸고 새로고침하면 상품목록이 안 받아오는데이유가server.js에서 app.use(express.json()); app.use(cors());가 지워졌기 때문이네요.노션에 올라와 있는 코드에 조금 안 맞는 부분이 있어서 카피해서 쓸 경우 제대로 처리하지 못하는거같아요깃헙 소스보니까 아래와 같이 되어 있는걸 보고 알았네요app.use(express.json()); app.use(cors()); app.get("/products", (req, res) => { res.send({ products: [ ..... 결론 깃헙소스와 노션소스가 조금 달라서 전부카피하면 안된다는!깃헙소스가 맞고노션소스가 틀리므로 노션 수정하면 좋겠다는 생각!
-
해결됨[리뉴얼] React로 NodeBird SNS 만들기
서버 요청 시 request cookie 가 2개가 생성이 됩니다..
안녕하세요 제로초님!최근 다시한번 노드버드를 참고하여 따로 사이드 프로젝트를 진행중에 있습니다.진행은 nginx 설정까지 마무리 하고 배포까지 성공적으로 진행이 되었습니다. 실제 사용도 했었고, 어제까지만 해도 큰 문제가 없었습니다. 다만 오늘 이미지를 로드해오는 과정에서 gateout 에러가 좀 발생하는것 같아 방법을 찾아보면서 pm2의 ecosystem.config.js 설정 등을 하다가 잘 안되는것 같아 다시 지우고 재 실행을 했습니다.실행을 다시 하니 로그인은 유지가 되는데, 데이터를 가져오려니 401 인증 에러가 발생하여 질문 드립니다..오류가 뜨는 이유가 무엇일까 생각했었는데, 우선 쿠키가 관련이 있겠다 생각해서 application - cookie 탭에서 확인을 해봤습니다.실제 도메인 주소, secure 설정까지 다 맞춰서 들어와있음을 확인했고, 그렇기에 새로고침을 했을 시 로그인은 유지가 되었습니다.네트워크 쪽을 살펴보니분명 쿠키가 같이 request 되고 있었습니다. 근데 이상하게도 쿠키가 application 에 저장된 문자와 다름을 확인했고 request 의 cookie 탭을 확인해보니이렇게 2가지 도메인으로 쿠키가 생성되어 전달되고 있음을 확인했습니다.하나는 api. 가 붙어있었고 하나는 실제 로그인을 유지시켜주는 도메인이었습니다.계속 고민을 해봐도 왜 request 에 위와같이 2개의 쿠키가 전달이 되는지 이유를 알 수 없어서 질문드립니다..도메인은 강의처럼 .주소 형식으로 했습니다.백엔드 nginx.conf 입니다프론트 nginx.conf 입니다프론트 pm2 list 입니다백엔드 pm2 list 입니다.답변 부탁드리겠습니다 ㅜㅜ...
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
백엔드 https 설정
안녕하세요 제로초님 혹시 백엔드도 /etc/nginx/nginx.conf 이것만 따로 설정해주고 /etc/nginx/sites-enabled/default 이건 프론트랑 똑같이 설정해주면 되는건가요?
-
미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
postgresql 연결 오류
안녕하세요. postgreSQL 셋업 과정 중에서 오류가 발생하여 질문 드립니다.강의대로 pg admin에 연결하면 다음과 같은 오류가 발생합니다.Unable to connect to server: FATAL: password authentication failed for user "mslee"아래 stackoverflow에서 확인한 결과 인증문제 같은데요.pg_hba.config 파일을 수정하면 인증문제를 해결할 수 있다고 해서 시도해봤지만 컨테이너에서 vi, vim으로 config 파일을 수정할 수 없어서 문제를 해결하지 못했습니다.문제 해결에 도움을 요청드립니다!https://stackoverflow.com/questions/7695962/password-authentication-failed-for-user-postgres컨테이너는 잘 띄워진 상태입니다.env파일도 잘 입력되어 있습니다.# app NODE_ENV=development PORT=5000 ADMIN_USER=mslee ADMIN_PASSWORD=1234 SECRET_KEY=sdafasdfasd DB_USERNAME=mslee DB_PASSWORD=1234 DB_HOST=localhost DB_PORT=5433 DB_NAME=inflearn # db POSTGRES_DB=inflearn POSTGRES_USER=mslee POSTGRES_PASSWORD=1234
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
mongo 실행 불가
안녕하세요 몽고디비를 다시 복습하고자 공부하던중 저번에 brew update를 통해 해결 된줄 알았지만 또 다시 같은 오류가 발생하였습니다... 이 에러는 어떠한 에러인지 찾아보고 gpt에다가 물어봐도 안나오는데.. 혹시 무엇 때문에 몽고가 brew services start mongodb-community 를하게 되면 이 오류가 발생하게 됩니다.. 도와 주세요..ㅠㅠ
-
미해결[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
(req,res,next) -> next()
책에서 프로젝트를 진행하다보면 보통try { }catch(error) {console.error(error);next(error)}로 next(error)를 해주시는데 error가 발생했을때 console.error(error)를 찍고 next(error)에서 에러처리(ex)프로젝트에서 app.use((err, req, res, next) => { res.locals.message = err.message; res.locals.error = process.env.NODE_ENV !== 'production' ? err : {}; res.status(err.status || 500); res.render('error'); });여기로로 보내지는게 맞나요?
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
nginx + https 적용하기 강의중
sudo service nginx start 할때 마다 Job for nginx.service failed because the control process exited with error code.See "systemctl status nginx.service" and "journalctl -xeu nginx.service" for details.이에러가 뜹니다https://www.zerocho.com/category/NodeJS/post/5ef450a5701d8a001f84baeb 이블로그 보면서 했습니다 ㅠㅠ
-
해결됨[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
제로초 슬랙방에 참여가 불가능합니다.
위와 같이 활성 상태가 아니라고만 뜹니다. http://bitly.ws/yCFL이 링크를 통해 들어가려고 시도했습니다.2번째 동영상 강의교안, 깃헙 등 링크모음 강의에 있는 링크 입니다.
-
미해결습관부터 바꿔주는 Node.js & Express 기초
prisma schema에서
@@index([$$$$], name: "$$$$")라는 것을 model 안에서 설정해주던데공식문서에 봐도 잘모르겠어요....혹시 설명 부탁드려도 될까요?