월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[리뉴얼] React로 NodeBird SNS 만들기
drop database 삭제 관련 질문
강의 수강중 우분투에서 sudo su로 mysql에 접속하여 drop database로 삭제를 하고 다시 exit을 통해 우분투로 와서 npx pm2 리로드를 하고 mysql 접속 후 데이터베이스를 불러오려하니 삭제가 되서 없어진것 같습니다. 그 이후 위 스샷처럼 홈페이지 회원가입 버튼 누를시 저런 창이 나오고 개인정보 입력 후 가입버튼을 눌러도 failure 응답에 경고창과 같은 문구가 나오고 있습니다. 아무래도 데이트베이스가 삭제되서 그런것 같은데 데이터베이스가 삭제되면 복구할 방법은 없을까요?
- 미해결[리뉴얼] React로 NodeBird SNS 만들기
백엔드 개발자와의 협업
si에서 개발할떄는 api개발자가 보통 안에 프로퍼티들을 다만들어서 줘서 그냥 호출해서썻엇는데요 .. 근데 보통은 개발할떄 안의 그런 프로퍼티들은 백엔드개발자가 정의하나요 ? 아니면 기획에서 해당옵션들이 다 나오는것인지 궁금합니다.. 얼마안되서 정의가안되서요..
- 미해결[리뉴얼] React로 NodeBird SNS 만들기
6:52초
디스팻치로 체인지닉네임을 실행시키면 create ation function 이 실행되는데 해당값에 그럼 data가 리턴되잖아요 ? 그게어떻게 reducre에 ation 파라미터로 들어가는거죠 ? state같은경우에는 해당값을 initialState로 설정해줫는데 data로 리턴한값이 어떻게 리듀서의 ation으로 들어가는지 모르겠습니다.
- 미해결[리뉴얼] React로 NodeBird SNS 만들기
redux-wrapper 버전 설치 이렇게하세요 6버전
npm i next-redux-wrapper@6 이렇게하시면 7버전 설치안되고 6버전되요 만약 7버전설치하셧으면 npm ininstall redux-wrapper 해서지우시고 다시 저렇게 설치하세요 ~
- 미해결[리뉴얼] React로 NodeBird SNS 만들기
해쉬태그가 불러와지지 않고 있습니다.
보시면 주소창에는 익스프레스 해시태그를 선택한 상태인데 화면에 출력은 변화하지 않고 있습니다. 리덕스에서는 정상적으로 선택된것 같은데 해당 해시태그로 이동하지 않고 있는것 같습니다. 그런데 또 해당 해시태그 주소에서 새로고침을 하면 위에 스샷 화면에서 해당 해쉬태그만 있는 게시물만 정상적으로 출력됩니다. 도대체 어디가 문제인지 갈피를 못잡고 있습니다. hashtag/[tag].js import React, { useEffect } from "react"; import axios from "axios"; import { useRouter } from "next/router"; import { END } from 'redux-saga'; import { useDispatch, useSelector } from "react-redux"; import AppLayout from "../../components/AppLayout"; import wrapper from "../../store/configureStore"; import PostCard from "../../components/PostCard"; import { LOAD_HASHTAG_POSTS_REQUEST } from "../../reducers/post"; import { LOAD_MY_INFO_REQUEST } from "../../reducers/user"; const Hashtag = () => { const dispatch = useDispatch(); const router = useRouter(); const { tag } = router.query; const { mainPosts, hasMorePosts, loadPostsLoading } = useSelector((state) => state.post); useEffect(() => { function onScroll() { if (window.scrollY + document.documentElement.clientHeight > document.documentElement.scrollHeight - 300) { if (hasMorePosts && !loadPostsLoading) { dispatch({ type: LOAD_HASHTAG_POSTS_REQUEST, lastId: mainPosts[mainPosts.length - 1] && mainPosts[mainPosts.length - 1].id, data: tag, }) } } } window.addEventListener('scroll', onScroll); return () => { window.removeEventListener('scroll', onScroll); } }, [hasMorePosts, loadPostsLoading, mainPosts.length, tag]) return ( <AppLayout> {mainPosts.map((c) => ( <PostCard key={c.id} post={c} /> ))} </AppLayout> ) } export const getServerSideProps = wrapper.getServerSideProps(async (context) => { const cookie = context.req ? context.req.headers.cookie : ''; axios.defaults.headers.Cookie = ''; if (context.req && cookie) { axios.defaults.headers.Cookie = cookie; } context.store.dispatch({ type: LOAD_MY_INFO_REQUEST, }) context.store.dispatch({ type: LOAD_HASHTAG_POSTS_REQUEST, data: context.params.tag, }) context.store.dispatch(END); await context.store.sagaTask.toPromise(); }) export default Hashtag; reducers/post.js case LOAD_USER_POSTS_REQUEST: case LOAD_HASHTAG_POSTS_REQUEST: case LOAD_POSTS_REQUEST: draft.loadPostsLoading = true; draft.loadPostsDone = false; draft.loadPostsError = null; break; case LOAD_USER_POSTS_SUCCESS: case LOAD_HASHTAG_POSTS_SUCCESS: case LOAD_POSTS_SUCCESS: draft.loadPostsLoading = false; draft.loadPostsDone = true; draft.mainPosts = draft.mainPosts.concat(action.data); draft.hasMorePosts = action.data.length === 10; break; case LOAD_USER_POSTS_FAILURE: case LOAD_HASHTAG_POSTS_FAILURE: case LOAD_POSTS_FAILURE: draft.loadPostsLoading = false; draft.loadPostsError = action.error; break; sagas/post.js function loadHashtagPostsAPI(data, lastId) { return axios.get(`/hashtag/${encodeURIComponent(data)}?lastId=${lastId || 0}`); } function* loadHashtagPosts(action) { try { const result = yield call(loadHashtagPostsAPI, action.data, action.lastId) yield put({ type: LOAD_HASHTAG_POSTS_SUCCESS, data: result.data, }) } catch (err) { console.error(err) yield put({ type: LOAD_HASHTAG_POSTS_FAILURE, error: err.response.data, }) } } routes/hashtag.js const express = require('express'); const { Hashtag, Post, Image, Comment, User } = require('../models'); const { Op } = require('sequelize'); const router = express.Router(); router.get('/:hashtag', async (req, res, next) => { // GET /hashtag/노드 try { const where = {}; if (parseInt(req.query.lastId, 10)) { // 초기 로딩이 아닐때 where.id = {[Op.lt]: parseInt(req.query.lastId, 10)} } const posts = await Post.findAll({ where, limit: 10, order: [['createdAt', 'DESC']], include: [{ model: Hashtag, where: { name: decodeURIComponent(req.params.hashtag) }, }, { model: User, attributes: ['id', 'nickname'], }, { model: Image, }, { model: Comment, include: [{ model: User, attributes: ['id', 'nickname'], order: [['createdAt', 'DESC']], }], }, { model: User, // 좋아요 누른사람 as: 'Likers', attiributes: ['id'], }, { model: Post, as: 'Retweet', include: [{ model: User, attiributes: ['id', 'nickname'], }, { model: Image, }] }] }); res.status(200).json(posts); } catch (error) { console.error(error); next(error); } }) module.exports = router; 코드입니다.
- 미해결[리뉴얼] React로 NodeBird SNS 만들기
로그인 정보 불러오기
로그인 정보를 불러올 때 현재 노드버드 앱 같은 경우에는 페이지 수가 적어서 가가 필요한 정보가 비슷해서 loadUserAPI시 항상 같은 데이터를 받아오는데 만약 페이지가 어느정도 많고 각 페이지에서 유저 관련된 필요한 정보가 많이 다를 경우에는 1. loadUserAPI를 여러개로 쪼갠 후에 loadUser 에서 경우에 따라 다른 api를 호출하는 게 좋은지 아니면 2. 액션을 여러개로 늘려서 하는 것이 좋을지 아니면 3. 모든 페이지에서 필요한 유저 관련 데이터의 합집합을 받는것이 좋을지 궁금하네요. 제 생각에는 2번인데 만약 2번이라면 그에 따른 코드량이 방대해 질텐데 (state수, 리듀서, 사가 등) 그래도 이렇게 하는게 가장 좋겠죠??
- 해결됨[리뉴얼] React로 NodeBird SNS 만들기
sequlize 질문 있습니다.
안녕하세요 제로초님! sequlize를 이용해서 배운 내용을 토대로 공부를 하고 있는데 create에서 몇일동안 잡히지 않는 에러가 있어서 제로초님께 질문 드립니다 ㅜ 다름이 아니라, 아래 코드를 가지고 mysql이랑 연동을 했는데 데이터베이스 컬럼?도 아래 4개로 구성되어있고 id는 자동생성인 상태인데, 왜 create한 결과가 null로 되는지 모르겠습니다.. sequlize에서 내부적으로 쿼리가 잘못되면 생성하지 않는 기능이 별도로 있는 것일까요?ㅜ graphql에 적용해보는데 console.log도 안먹히고 어떻게 해야할 지 모르겠습니다 ㅜㅜ const newUser = await User.create({ email: email, password: hashpw, type: "user", token: "", });
- 미해결[리뉴얼] React로 NodeBird SNS 만들기
label을 쓰면 Input 태그에 id를 넣지 않나요?
안녕하세요. label 을 쓰는 이유가 Input 태그에 id를 넣어서 함께 묶어 사용하려는 것 아닌가요? Input 태그에 id 태그 대신 name 태그를 사용하는 이유가 있나요?? 읽어주셔서 감사합니다.
- 미해결[리뉴얼] React로 NodeBird SNS 만들기
선생님 이해가안되서요
index.js profile.js signup.js 의 최상위가 갑자기 어떻게 _app.js가 되죠 ? 넥스트에서 해준다고하는데 그렇게 원래 다른프로젝트에서도 설정하는것인가요 ? _app.js 비구조화 할당 component에서는 어떤값을 받나요 ?
- 미해결[리뉴얼] React로 NodeBird SNS 만들기
파일인식
선생님 react 다른강의배울때 파일생성할때 카멜케이스 문법으로 proFile 이런식으로 생성하고 export default ProFile 이런식으로 바꿔줫는데 파일이름을 proFile 이런식으로하면 next가 인식못해서 404에러 뜨더라구요 페이지찾을수없다고 그래서 profile.jsx 이렇게 바꿔주니 잘되요 결론: 파일이름 무조건 소문자로 해야하나요 ?
- 미해결[리뉴얼] React로 NodeBird SNS 만들기
자꾸 post가 작동하지 않습니다.
아니 teacher처럼 똑같이 5:56부분처럼 햇는데 왜 저는 안될까요? app.js안에 node express를 사용하면 간단하게 url를 만들 수 있는데 우선 get은 잘 작동을 합니다. 근데 postman을 이용해서 post를 사용할 때 문제가 생깁니다. const express = require('express'); const postRouter = require('./routes/post'); const userRouter = require('./routes/user'); const db = require('./models'); const cors = require('cors'); const passportConfig = require('./passport'); const app = express(); db.sequelize.sync() .then(() => { console.log('db 연결 성공'); }). catch(console.error); passportConfig(); app.use(cors({ origin: '*', credentials: false, })); app.use(express.json()); app.use(express.urlencoded({ extended: true })); app.get('/', (req, res) => { res.send('hello express'); }) app.post('/api/testPost', (req,res) => { res.json({id :2, content:'result'}); }) app.get('/api/testPost' , (req, res) => { res.json([ { id: 1, content: 'hello'} ]); }); app.use('/post', postRouter); app.use('/user', userRouter); app.listen(3065, () => { console.log('서버 실행 중'); }); 현재 app.js인데 이보다 좀 뒤에 강의에서 제가 뭔가 안된다고 질문을 올렸는데 생각을 해 보니 postman에서 post로 요청을 할 때부터 무언가 안되기 시작해서 다시 돌려보고 있는 와중에 문제점을 찾았습니다. 코드에 제가 app.post('/api/testPost', (req, res) => { res.json({id:2, content:'result'}) }) 로 작성하고 postman에서 post요청을 보낸 결과... 아무 반응도 일어나지가 않습니다. 서버가 올라가지 않았으면 애초에 get 요청도 보이지가 않아야 하는데 get은 되고 왜 post는 되는건지 이해가 안됩니다. 좀 도와주십시오 ㅠㅠ
- 미해결[리뉴얼] React로 NodeBird SNS 만들기
에러가 나는데 도저히 못찾겠습니다 ㅠㅠ
현재 안되는 부분의 오류입니다. action값을 sagas의 user.js에서 받아서 yield call(signUpAPI, action.data);하는 부분에서 오류가 납니다. 오류 메시지를 타고 가보면 무슨 data가 선언이 안됐다는 뚱딴지 같은 오류를 내보내는데 도대체 이해가 안됩니다. ㅠㅠ signup 하는 데서 오류가 발생한다! 그래서 쭈욱 따라가보니... undefined라는 이상한 오류... 도대체 뭐가 문제일까요? 회원가입시 입력한 값은 다 받아오는데 이제 API를 타고 back에 데이터를 넣어주지를 못하고 잇습니다. sagas 안에 user.js에 console을 제가 찎어봤는데 yield call(signUpAPI, action.data) 이 부분에서 터져버립니다. import { all, delay, fork, put, takeLatest, call } from 'redux-saga/effects'; import { FOLLOW_FAILURE, FOLLOW_REQUEST, FOLLOW_SUCCESS, LOG_IN_FAILURE, LOG_IN_REQUEST, LOG_IN_SUCCESS, LOG_OUT_FAILURE, LOG_OUT_REQUEST, LOG_OUT_SUCCESS, SIGN_UP_FAILURE, SIGN_UP_REQUEST, SIGN_UP_SUCCESS, UNFOLLOW_FAILURE, UNFOLLOW_REQUEST, UNFOLLOW_SUCCESS, } from '../reducers/user'; function logInAPI(data) { return axios.post('/api/login', data); } function* logIn(action) { try { console.log('saga logIn'); // const result = yield call(logInAPI); yield delay(1000); yield put({ type: LOG_IN_SUCCESS, data: action.data, }); } catch (err) { console.error(err); yield put({ type: LOG_IN_FAILURE, error: err.response.data, }); } } function logOutAPI() { return axios.post('/api/logout'); } function* logOut() { 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, error: err.response.data, }); } } function signUpAPI(data) { return axios.post('http://localhost:3065/user', data); } function* signUp(action) { try { console.log("뭐가 이상한데1"); console.log("action.data" , action.data); const result = yield call(signUpAPI, action.data); console.log("뭐가 이상한데2"); yield put({ type: SIGN_UP_SUCCESS, }); } catch (err) { yield put({ type: SIGN_UP_FAILURE, error: err.response.data, }); } } function followAPI() { return axios.post('/api/follow'); } function* follow(action) { try { // const result = yield call(followAPI); yield delay(1000); yield put({ type: FOLLOW_SUCCESS, data: action.data, }); } catch (err) { console.error(err); yield put({ type: FOLLOW_FAILURE, error: err.response.data, }); } } function unfollowAPI() { return axios.post('/api/unfollow'); } function* unfollow(action) { try { // const result = yield call(unfollowAPI); yield delay(1000); yield put({ type: UNFOLLOW_SUCCESS, data: action.data, }); } catch (err) { console.error(err); yield put({ type: UNFOLLOW_FAILURE, error: err.response.data, }); } } function* watchFollow() { yield takeLatest(FOLLOW_REQUEST, follow); } function* watchUnfollow() { yield takeLatest(UNFOLLOW_REQUEST, unfollow); } function* watchLogIn() { yield takeLatest(LOG_IN_REQUEST, logIn); } function* watchLogOut() { yield takeLatest(LOG_OUT_REQUEST, logOut); } function* watchSignUp() { yield takeLatest(SIGN_UP_REQUEST, signUp); } export default function* userSaga() { yield all([ fork(watchFollow), fork(watchUnfollow), fork(watchLogIn), fork(watchLogOut), fork(watchSignUp), ]); } 또 심각한점은 여기 network를 보시면 아예 응답 자체가 넘어가지 않고 있는 모습을 확인할 수 있습니다. post가 안되면 post실패다 뭐가 status가 나와야 하는데 아무리 가입하기를 눌러도 그런 모습은 확인할 수 없습니다.
- 미해결[리뉴얼] React로 NodeBird SNS 만들기
로그아웃 -> 마이페이지 properties of null 에러 발생
안녕하세요 제로초님 ! 로그인 상태가 false일 경우, '마이페이지'가 보이도록, 반대일 경우엔 '로그인'이 보이도록 페이지를 만들었습니다. 문제는 마이페이지(유저프로필)에서 로그아웃 버튼을 누르면 user가 정상적으로 null값으로 바뀌는데 여기서 왜 Posts 속성이 없다는 에러가 발생하는지 모르겠습니다.. 로그아웃을 하는데 왜 마이페이지 에러가 발생하는걸까요 ㅠㅠ.. //components/AppLayout.js import React from "react"; import PropTypes from "prop-types"; import Link from "next/link"; import { Row, Col } from "antd"; import styles from '../styles/styles.module.css'; import { useSelector } from 'react-redux'; const AppLayout = ({ children }) => { const {logInDone} = useSelector((state) => state.user); return ( <> <Link href="/"> <a><h1 className={styles.logo}>놀멍쉬멍 <img src="logoIcon.png" alt="logoImage" style={{width: '24px'}} /></h1> </a> </Link> <div>{children}</div> <Row className={styles.bottomNav}> <Col xs={4}><Link href="/writePost"><a>새글작성</a></Link></Col> <Col xs={4}><Link href="/community"><a>커뮤니티</a></Link></Col> <Col xs={8}> <Link href="/"> <a><img className={styles.centerNav} src='../icon.png'/></a> </Link> </Col> <Col xs={4}><Link href="/findPlace"><a>장소검색</a></Link></Col> {logInDone ? <Col xs={4}><Link href="/mypage"><a>마이페이지</a></Link></Col> : <Col xs={4}><Link href="/login"><a>로그인</a></Link></Col>} </Row> </> ); }; AppLayout.propTypes = { children: PropTypes.node.isRequired, }; export default AppLayout; //pages/login.js import React from "react"; import AppLayout from "../components/AppLayout"; import Head from 'next/head'; import MyPage from '../components/MyPage'; import LoginForm from '../components/LoginForm'; import { useSelector } from 'react-redux'; const login = () => { const {logInDone} = useSelector((state) => state.user); return ( <> <Head> <meta charSet="utf-8" /> <title>로그인 | 놀멍쉬멍</title> </Head> <AppLayout> { logInDone ? <MyPage /> : <LoginForm />} </AppLayout> </> ); }; export default login; //pages/myPage.js import React from 'react'; import AppLayout from '../components/AppLayout'; import Head from 'next/head'; import MyPage from '../components/MyPage'; import LoginForm from '../components/LoginForm'; import { useSelector } from 'react-redux'; const myPage = () => { const {logInDone} = useSelector((state) => state.user); return ( <> <Head> <meta charSet="utf-8" /> <title>마이페이지 | 놀멍쉬멍</title> </Head> <AppLayout> { logInDone ? <MyPage /> : <LoginForm />} </AppLayout> </> ); }; export default myPage; //components/LoginForm.js import React, { useCallback, useEffect } from 'react'; import {Form, Input, Button} from 'antd'; import Link from 'next/link'; import styles from '../styles/login.module.css'; import styled from 'styled-components'; import useInput from '../hooks/useInput'; import { useDispatch, useSelector } from 'react-redux'; import {loginRequestAction} from '../reducers/user'; const LoginBtn = styled(Button)` background-color: white; border: 1px solid #857171; max-width: 600px; margin: 20px 0; width: 100%; margin-bottom: 40px; height: 40px; &:hover { background-color: #857171; border: 1px solid #857171; color: white; } `; const LoginInput = styled(Input)` height: 40px; `; const LoginForm = () => { const dispatch = useDispatch(); const {logInLoading} = useSelector((state) => state.user); const [email, onChangeEmail] = useInput(''); const [password, onChangePassword] = useInput(''); const onSubmitBtn = useCallback(() => { console.log(email, password); dispatch(loginRequestAction({email, password})); }, [email, password]); return ( <> <Form className={styles.loginForm} onFinish={onSubmitBtn}> <div className={styles.inputWrapper}> <label htmlFor="user-email">이메일</label> <br /> <LoginInput name="user-email" type="email" value={email} onChange={onChangeEmail} required/> </div> <div className={styles.inputWrapper}> <label htmlFor="user-password">비밀번호</label> <br /> <LoginInput name="user-password" type="password" value={password} onChange={onChangePassword} required /> </div> <div className={styles.buttonWrapper}> <LoginBtn htmlType="submit" loading={logInLoading}>로그인</LoginBtn> < br/> <span>놀멍쉬멍이 처음이신가요?</span> <Link href="/signup"><a>회원가입</a></Link> </div> </Form> </> ); }; export default LoginForm; //components/MyPage.js import React, { useCallback } from 'react'; import {Card, Avatar, Button} from 'antd'; import FollowList from './FollowList'; import styled from 'styled-components'; import page from '../styles/wrapper.module.css'; import { useDispatch, useSelector } from 'react-redux'; import {logoutRequestAction} from '../reducers/user'; const LogoutBtnWrapper = styled.div` display: flex; justify-content: flex-end; button { border: none; background-color: transparent; color: gray; } `; const MyPage = () => { const dispatch = useDispatch(); const {logOutLoading, user} = useSelector((state) => state.user); const onLogout = useCallback(() => { dispatch(logoutRequestAction()); }, []); return ( <div className={page.pageWrapper}> <div> <Card cover={ <img alt="my_profile_pic" src="../cute.jpeg" />} actions={[ <div key="writedPost">작성한 글<br />{user.Posts.length}</div>, <div key="followings">팔로잉<br />{user.Followings.length}</div>, <div key="followers">팔로우<br />{user.Followers.length}</div> ]} > <Card.Meta avatar={<Avatar>{user.nickname[0]}</Avatar>} title={user.nickname} description="개냥이 키웁니다 우하하" /> <br /> <LogoutBtnWrapper> <Button onClick={onLogout} loading={logOutLoading}>로그아웃</Button> </LogoutBtnWrapper> </Card> </div> <div> <div style={{margin: '20px 0'}}> <FollowList header="나를 팔로잉하는 사람" data={user.Followings}/> <FollowList header="내가 팔로우하는 사람" data={user.Followers}/> </div> </div> </div> ); }; export default MyPage;
- 미해결[리뉴얼] React로 NodeBird SNS 만들기
http 상태코드에 관하여
안녕하세요 제로초님 저는 이 강의로 유익하고 재미있게 공부를 하는 프론트개발 초보자 입니다.저는 여태 백엔드쪽에서 내려주는 상태들 200ok, 401 error, 500error 등 http상태코드가 자동으로 나오는줄 알았는데 백엔드에서 직접 내려주는걸 알게되었어요. 조금 이상한 생각일지도 모르겠으나 백엔드 개발자가 악의적으로 프론트 에러처럼 서버 에러(500번대)도 400번대로 내려주고 혹은 백엔드개발자도 초보여서 이게 400에러인지, 500에러인지 헷갈려서 잘못 내려주는등의 실수를 할 수 있는건가요? 그렇다면 저같은 초보자들은 상태코드를 나침반 삼아 어디서 에러를 내는지 찾는데 방해가 될꺼같거든요.... ㅠㅜ 이런 사소한 질문까지 드려서 죄송합니다. 급한건 아니니 다른 질문에 답변하시고 시간나실때 답변 부탁드려요
- 미해결[리뉴얼] React로 NodeBird SNS 만들기
강의를 보다가 if-else를 안쓰시고, 계속 if만 쓰시던데 속도의 차이가 있는건지, 가독성 때문인건지 특별한 이유가 있나요?
(사진)
- 미해결[리뉴얼] React로 NodeBird SNS 만들기
CSR vs SSR
안녕하세요! 강좌 너무너무 잘 보고 있습니다 :) 계속 수강을 하면서 궁금한 점이 생겨 질문 드립니다. 1. CSR과 SSR의 차이가 SSR은 애초에 사이트가 로드될 때 부터 데이터가 담겨있다는 것이라고 배웠는데요. 그럼 어느 경우에 CSR을, 또 어떤 경우에는 SSR을 쓰시는지 알 수 있을까요!? 어떻게 구분해서 써야하는지 아직 잘 모르겠어서요 :( 2. 또, 로그인 정보를 불러오기 위해서 컴포넌트마다 getServerSideProps를 통해 로그인 정보 요청 request를 보내셨는데, 이건 글로벌하게 하나의 파일로 만들어서 사용할 수 없는 것인지 궁금합니다. 제 질문이 바보같은 질문은 아니였나 모르겠네요 .. ㅠㅠ 답변 주시면 감사하겠습니다 !!
- 미해결[리뉴얼] React로 NodeBird SNS 만들기
Next link 서버사이드렌더링 질문
안녕하세요! 강의를 응용해서 블로그를 만들어보고 있는데요! <a href="/">Home</a> <Link href="/" ><a>Home<a/></Link> a태그를 이용해 이동 할 경우, 아래 getServerSideProps가 잘 작동하여, 데이터가 채워지는데, Link를 이용해 이동 할 경우 데이터가 채워지지 않습니다. export const getServerSideProps = wrapper.getServerSideProps(async (context) => { const cookie = context.req ? context.req.headers.cookie : ''; axios.defaults.headers.Cookie = ''; if (context.req && cookie) { axios.defaults.headers.Cookie = cookie; } context.store.dispatch({ type: LOAD_MY_INFO_REQUEST, }) context.store.dispatch({ type: LOAD_POSTS_REQUEST, }); context.store.dispatch(END); await context.store.sagaTask.toPromise(); }); 새로고침이 되지 않으면 데이터가 채워지지 않는 것 같은데, 몇일 간 관련 자료를 찾아보아도 이런 경우가 없는 것 같아 질문드립니다..
- 미해결[리뉴얼] React로 NodeBird SNS 만들기
배포후 테스트중입니다. redux-dev-tools가 보입니다.
좋은 강의 감사합니다. 이제 배포 후 테스트 중인데. 개발자 도구에 redux가 계속 나타나서요. 코드에는 문제가 없는거 같은데 nodebird.com가서 보니 여기도 액션을 볼수 있네요. 혹시 배포 버전에서는 어떻게 숨기나요?
- 미해결[리뉴얼] React로 NodeBird SNS 만들기
ReactDOM에서 에러가 발생합니다.
안녕하세요. 강의를 듣고 좀더 익숙해 지고 싶어서 처음부터 다시 듣고 있는데 로그인폼 생성 후 회원가입 창과 프로필 창을 들어가면 위와 같은 에러가 발생합니다. 혹시 원인을 알려주신다면 진심으로 감사하겠습니다...
- 미해결[리뉴얼] React로 NodeBird SNS 만들기
app.use(express.json()), app.use(express.urlencoded({extended:true})) 클라이언트에서 보낸 데이터 사용에 관한 질문입니다.
app.use(express.json()); app.use(express.urlencoded({ extended: true }));req.body에 클라이언트에서 보내느 json데이터와 form에서 전달된 데이터를 사용할때 필요한 거라고 알고있는데 body-parser라는것을 설치 하지 않고 express에서 자체적으로도 제공을 하는건지 궁금합니다. body-parser로 안해줘도 되는건가요?