inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[리뉴얼] React로 NodeBird SNS 만들기

서버사이드렌더링 준비하기

TypeError: Cannot read properties of undefined (reading 'dispatch')

1214

혜진

작성한 질문수 18

0

질문 없이 알아서 찾고싶은데 생각처럼 진짜 안되네요... 현재 강의 6분30초에서 멈춰있습니다. 에러에 dispatch 가 안된다 하여 또 보니 store 가 undefined 라고 뜹니다. 밑에 저와 똑같은 에러가 발생한 분은 오타셨고 저도 열씸히 오타인지 찾아봤지만 제대로 작성한것 같습니다 configureStore 도 잘 import 했는데 뭐가 문제일까요 서버도 다 재시작해봤는데 안돼용

 

// index.js
 
import React, { useEffect } from "react";
import { useDispatch, useSelector } from "react-redux";

import AppLayout from "../components/AppLayout";
import PostForm from "../components/PostForm";
import PostCard from "../components/PostCard";
import { LOAD_POSTS_REQUEST } from "../reducers/post";
import { LOAD_USER_REQUEST } from "../reducers/user";
import wrapper from "../store/configureStore";


const Home = () => {
const dispatch = useDispatch();
const { me } = useSelector((state) => state.user);
const { mainPosts, hasMorePosts, loadPostsLoading, retweetError } = useSelector((state) => state.post);

// 자신의 게시글을 리트윗하려 할 때
useEffect(() => {
if(retweetError) {
alert(retweetError);
}
}, [retweetError]);


useEffect(() => {
// 현재 어느 스크롤 위치에 있는지 판단
function onScroll() {
if (
window.scrollY + document.documentElement.clientHeight >
document.documentElement.scrollHeight - 300
) {
if (hasMorePosts && !loadPostsLoading) {
// 로딩이 되고 있을 동안 loadPostsLoading 은 true 이므로 해당 코드 실행되지 x
// 로딩이 끝나고 나서 loadPostsLoading 가 false 가 되면 그때 실행
const lastId = mainPosts[mainPosts.length - 1]?.id // 마지막 게시글 id
// && 대신 optional chaining 활용
// => 게시물이 하나도 없을 경우 undefined.id 에러가 발생할 수 있으므로 ?. 로 방지
dispatch({
type: LOAD_POSTS_REQUEST, // 스크롤 다 내리면 다음 더미데이터 로딩해라
lastId, // 마지막 게시글 id
})
}
}
}
window.addEventListener("scroll", onScroll);
 
return () => {
window.removeEventListener("scroll", onScroll);
};
}, [hasMorePosts, loadPostsLoading, mainPosts]);

return (
<AppLayout>
{me && <PostForm />}
{/* 로그인이 된 상태에서만 포스트를 작성할 수 있음 */}
{mainPosts.map((post) => (
<PostCard key={post.id} post={post} />
))}
</AppLayout>
);
};

 
export const getServerSideProps = wrapper.getServerSideProps((context) => {
context.store.dispatch({
type: LOAD_USER_REQUEST,
});
context.store.dispatch({
type: LOAD_POSTS_REQUEST,
});
// console.log(context);
});
 

export default Home;

 

// configureStore.js

import { createWrapper } from "next-redux-wrapper";
import { applyMiddleware, compose, createStore } from "redux";
import { composeWithDevTools } from 'redux-devtools-extension';
import createSagaMiddleware from 'redux-saga';

import reducer from "../reducers";
import rootSaga from '../sagas';

 
const loggerMiddleware = ({ dispatch, getState }) => (next) => (action) => {
console.log(action) // action 을 실행하기 전에 console.log() 를 한번 실행해주는 미들웨어
return next(action);
}

const configureStore = () => {
const sagaMiddleware = createSagaMiddleware()
// const middlewares = [sagaMiddleware];
const middlewares = [sagaMiddleware, loggerMiddleware];
// enhancer: 리덕스의 기능이 확장된 것
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; // state , reducer 를 포함한 것
};

// next-redux-wrapper 로 만듦
const wrapper = createWrapper(configureStore, {
debug: process.env.NODE_ENV === "development",
});

export default wrapper;


 

react redux express nodejs Next.js

답변 4

0

혜진

아 버전 문제였군요 제가 지금 7버전인데 대댓글을 ㅅ끝까지 안봤습니다... 아래 답변하신 분이 올린 코드대로 했더니 store 문제가 해결됐는데 이유가 뭔지 알 수 있을까요?

 

 

0

제로초(조현영)

비교해보시면 wrapper.getServerSideProps의 모양이 바뀌었습니다. 내부 고차함수가 바뀌었습니다.

0

혜진

 

import React from "react";
import Proptypes from "prop-types";
import Head from "next/head";
import "antd/dist/antd.css";

import wrapper from "../store/configureStore";

const NodeBird = ({ Component }) => {
return (
<>
<Head>
<meta charSet="utf-8" />
<title>NodeBird</title>
</Head>
<Component />
</>
);
};

NodeBird.propTypes = {
Component: Proptypes.elementType.isRequired,
};

export default wrapper.withRedux(NodeBird);

_app.js 강의 코드와 똑같습니다

 

0

혜진

그래서 제가 이미 store 도 확인해봤는데 원본과 다를게 없는 코드였어서,,  configureStore 파일 말고 더 확인할 곳이 있을까요,, 복붙해서 실행해밨는데도 똑같아여

0

제로초(조현영)

_app.js쪽 봐보세요.

0

제로초(조현영)

이건 store 연결이 제대로 안 된거라고밖에는 보여지지 않습니다. store쪽에 문제가 있을 겁니다.

넥스트 버젼 질문

0

78

2

로그인시 401 Unauthorized 오류가 뜹니다

0

89

1

무한 스크롤 중 스크롤 튐 현상

0

175

1

특정 페이지 접근을 막고 싶을 때

0

103

2

createGlobalStyle의 위치와 영향범위

0

96

2

인라인 스타일 리렌더링 관련

0

91

2

vsc 에서 npm init 설치시 오류

0

146

2

nextjs 15버전 사용 가능할까요?

0

158

1

화면 새로고침 문의

0

121

1

RTK에서 draft, state 차이가 있나요?

0

153

2

Next 14 사용해도 될까요?

0

452

1

next, node 버전 / 폴더 구조 질문 드립니다.

0

349

1

url 오류 질문있습니다

0

211

1

ssh xxxxx로 우분투에 들어가려니까 port 22: Connection timed out

0

373

1

sudo certbot --nginx 에러

0

1275

2

Minified React error 콘솔에러 (hydrate)

0

470

1

카카오 공유했을 때 이전에 작성했던 글이 나오는 버그

0

247

1

프론트서버 배포 후 EADDRINUSE에러 발생

0

327

1

npm run build 에러

0

518

1

front 서버 npm run build 중에 발생한 에러들

0

382

1

서버 실행하고 브라우저로 들어갔을때 404에러

0

338

2

css 서버사이드 랜더링이 적용되지 않아서 문의 드립니다.

0

288

1

팔로워 3명씩 불러오고 데이터 합쳐주는걸로 바꾸고 서버요청을 무한으로하고있습니다.

0

239

2

해시태그 검색에서 throttle에 관해 질문있습니다.

0

201

1