월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[리뉴얼] React로 NodeBird SNS 만들기
retweet 취소하기
배포단계와 보너스 강좌를 보면서 댓글 리트윗 , 좋아요 , 삭제 , 수정 및 리트윗한 게시글 다시 리트윗버튼을 클릭했을 때 해당 게시글을 지우려고 기능을 추가하려고 하고 있습니다그래서 구조를 해당 리트윗 게시글을 me.Posts 안에서 리트윗한 아이디와 해당 게시글의 post.id가 일치하는 게시글을 삭제하려고하는데 해당 구조로 짜게 되면 맨처음 페이지가 로딩되고 나서 데이터를 받아오는 Post를 인식해서 그런지 리트윗 되어있던걸 삭제하는건 가능한데 삭제 후 다시 리트윗 하고 삭제하려면 id가 그 처음 리트윗되어있던 id를 찾습니다.(기존 리트윗 되어있던 post.id) (리트윗 삭제 후 다시 리트윗 하고 나서 리트윗 버튼 클릭시 나오는 post.id) 리트윗 제거하고 다시 리트윗 하면 DB와 me.Posts 와 mainPosts 안에 데이터가 새롭게 추가되는건 확인이 되는데 왜 초기 데이터값만을 읽는건지 모르겠습니다. 항상 늦은 시간에도 답변해주셔서 감사합니다.(그리고 워낙 질문이 많아서 죄송해요)
- 해결됨[리뉴얼] React로 NodeBird SNS 만들기
시퀄라이즈 order에 대해
const post = await Post.findOne({ where: { id: parseInt(req.query.postId) }, order: [ [{ model: Comment }, "createdAt", "ASC"], [{ model: Nested_Comment }, "createdAt", "ASC"], ], include: [ { model: Image, attributes: ["id", "src"] }, { model: User, attributes: ["id", "nickname", "profile_img"], }, { model: Comment, include: [ { model: User, attributes: ["id", "nickname", "profile_img"], }, { model: Nested_Comment, include: [ { model: User, attributes: ["id", "nickname", "profile_img"], }, ], }, ], }, { model: User, as: "Likers", }, { model: Image }, ], });강좌를 듣고 게시판을 하나 만들고 있는 중인데요Comment를 createdAt 기준으로 ASC 정렬,Nested_Comment를 createdAt 기준으로 ASC정렬 하고 싶은데Comment 까지는 정렬이 되지만 아무리 고쳐봐도 Nested_Comment는 적용이 안되네요. 공식문서도 자세하게 나오지는 않고..도저히 안되겠어서 질문드립니다. Nested_Comment까지 정렬하고 싶으면 어떻게 order 속성을 작성해야 하나요?
- 미해결[리뉴얼] React로 NodeBird SNS 만들기
mysqlworkbench 에서 table 불러오기
시퀄라이즈 모델 만들기 강의 부분 듣고 있습니다.user.js 부분 기본 뼈대 만들고 mysqlworkbench 에서 확인하려면 백서버를 실행시켜야 할거 같은데 백서버 실행시킬때 node app.js 하면 되는 걸까요?
- 해결됨[리뉴얼] React로 NodeBird SNS 만들기
[공유목적] nginx 설정 후 쿠키가 전달되지 않을 경우
작성한 이유(저는 이 문제로 골머리를 앓았어서..)도메인 설정 후 쿠키가 전달되지 않아 로그인이 되지 않았다가 해결되었습니다session 설정 뿐만 아니라 nginx 설정도 확인해야 합니다혹시라도 이 문제로 고통받으시는 분이 있다면 해결책이 되길 바랍니다 back쪽 session 설정if (process.env.NODE_ENV === "production") { app.use(morgan("combined")); app.use(hpp()); app.use(helmet()); app.set("trust proxy", 1); //배포 시 추가 app.use( cors({ origin: "https://engword.shop", //local "http://localhost:3000" credentials: true, }) ); } else { app.use(morgan("dev")); app.use( cors({ origin: true, credentials: true, }) ); } passportConfig(); app.use(express.json()); app.use(express.urlencoded({ extended: true })); app.use(cookieParser(process.env.COOKIE_SECRET)); app.use( session({ saveUninitialized: false, resave: false, secret: process.env.COOKIE_SECRET, proxy: true, //배포 시 추가 cookie: { httpOnly: true, secure: process.env.NODE_ENV === "production" ? true : false, //https 적용 시 true sameSite: process.env.NODE_ENV === "production" ? "none" : false, domain: process.env.NODE_ENV === "production" && ".engword.shop", }, }) ); nginx 설정back 에서 설정한 nginx입니다sudo vim /etc/nginx/nginx.confserver { server_name api.engword.shop; location / { proxy_set_header HOST $host; //추가 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header X-Real-IP $remote_addr; proxy_pass http://127.0.0.0:3000 //http로 설정할 것 proxy_redirect off; } //아래는 certbot 내용 }위와 같이 설정을 바꾼 후 nginx를 다시 실행합니다sudo systemctl restart nginx pm2로 진행 시 pm2를 껏다 키거나, pm2 재시작을 하시면 됩니다.pm2 껏다 키는 경우sudo npx pm2 killnpm start (혹은 sudo npm start)pm2 재시작sudo npx pm2 reload all
- 해결됨[리뉴얼] React로 NodeBird SNS 만들기
add, edit, delete 할때마다 db에서 re-fetch 하면 어떻게 될까요?
안녕하세요 수업 듣던 중 궁금한 게 생겼습니다.현재 request action을 dispatch할 때, reducer도 바꾸고, saga도 바꿔서예를들어 post를 add 할땐 unshift()를 쓴다던지, delete할땐 filter()를 쓴다던지 해서 db 뿐만 아니라 post들을 프론트 단에서도 계속 상태를 업데이트 해주고 있잖아요. 근데 만약에, add, edit 또는 delete를 해주는 request action의 경우에는saga로만 request action을 dispatch하고, 비동기 요청이 성공했을 때마다, 그것에 대한 follow up request로 다시 처음부터 변경된 모든 post들을 db로부터 가져오면 어떨까요? 이미 db에서 post들의 상태가 업데이트 됐는데, 프론트에서도 post들의 상태를 업데이트 하게 되면 일을 2번 하게 되는 거니까 코드만 더 길어지는 거 아닐까? 궁금하고요.프론트에서 한번 더 post들의 상태를 업데이트 했을 때 얻는 이점이 무엇인지도 모르겠습니다. 제가 드리고 싶은 질문이 글로 잘 전달이 됐는지 모르겠는데, 만약 제 질문이 이해가 되셨다면 둘의 장단점을 알려주시면 감사하겠습니다!
- 미해결[리뉴얼] React로 NodeBird SNS 만들기
게시글 개별 조회 첫 렌더링 시null 문제
안녕하세요 선생님. 게시글 개별조회를 할 때 처음에는 singlePost가 null이라고 했다가 새로고침을 하면 데이터가 로드되는 부분은 어디를 봐야 하나요?개별 게시글 조회 컴포넌트에서 getServerSideProps로 dispatch type은 개별 게시글 조회, data는 context.params.id를 보내서 받아오고 있습니다.에러가 뜰 때 콘솔 창에서는 개별 게시글 조회 컴포넌트 다음으로 _app.js를 가리키는데, 이 컴포넌트는 모양도 단순하고 노드버드와 차이가 없어서 어딜 봐야 하는지 모르겠습니다..조언 부탁드립니다 선생님
- 미해결[리뉴얼] React로 NodeBird SNS 만들기
Aws s3
배포를 하려고 하는 와중에 Aws s3 사용에 관련해서 과금이 많이 나올까봐 걱정이 되는데 혹시 보안적으로 안전하게 사용하는 방법 있을까요?
- 해결됨[리뉴얼] React로 NodeBird SNS 만들기
npx sequelize db:create
npx sequelize db:create를 하면 제로초님 처럼 Access denied for user 'root'@'localhost' (using password: YES) 이게 뜹니다 그래서 mysql로 들어가서 root 비밀번호를 바꿨습니다. 이렇게 뜨고 잘 바꿨는데도 계속 에러가 뜹니다. 구글에도 쳐보고 했지만 mysql_native_password 로 바꾸는 안내만 봐서... 어떻게 조치를 더 해야될까요 ?
- 해결됨[리뉴얼] React로 NodeBird SNS 만들기
npm run dev 에러
[제로초 강좌 질문 필독 사항입니다]질문에는 여러분에게 도움이 되는 질문과 도움이 되지 않는 질문이 있습니다.도움이 되는 질문을 하는 방법을 알려드립니다.https://www.youtube.com/watch?v=PUKOWrOuC0c0. 숫자 0부터 시작한 이유는 1보다 더 중요한 것이기 때문입니다. 에러가 났을 때 해결을 하는 게 중요한 게 아닙니다. 왜 여러분은 해결을 못 하고 저는 해결을 하는지, 어디서 힌트를 얻은 것이고 어떻게 해결한 건지 그걸 알아가셔야 합니다. 그렇지 못한 질문은 무의미한 질문입니다.1. 에러 메시지를 올리기 전에 반드시 스스로 번역을 해야 합니다. 번역기 요즘 잘 되어 있습니다. 에러 메시지가 에러 해결 단서의 90%를 차지합니다. 한글로 번역만 해도 대부분 풀립니다. 그냥 에러메시지를 올리고(심지어 안 올리는 분도 있습니다. 저는 독심술사가 아닙니다) 해결해달라고 하시면 아무런 도움이 안 됩니다.2. 에러 메시지를 잘라서 올리지 않아야 합니다. 입문자일수록 에러메시지에서 어떤 부분이 가장 중요한 부분인지 모르실 겁니다. 그러니 통째로 올리셔야 합니다.3. 코드도 같이 올려주세요. 다만 코드 전체를 다 올리거나, 깃헙 주소만 띡 던지지는 마세요. 여러분이 "가장" 의심스럽다고 생각하는 코드를 올려주세요.4. 이 강좌를 바탕으로 여러분이 응용을 해보다가 막히는 부분, 여러 개의 선택지 중에서 조언이 필요한 부분, 제 경험이 궁금한 부분에 대한 질문은 대환영입니다. 다만 여러분의 회사 일은 질문하지 마세요.5. 강좌 하나 끝날 때마다 남의 질문들을 읽어보세요. 여러분이 곧 만나게 될 에러들입니다.6. 위에 적은 내용을 명심하지 않으시면 백날 강좌를 봐도(제 강좌가 아니더라도) 실력이 늘지 않고 그냥 코딩쇼 관람 및 한컴타자연습을 한 셈이 될 겁니다.
- 미해결[리뉴얼] React로 NodeBird SNS 만들기
svg 파일 관련 질문드립니다.
svg 파일을 사용하기 위해서 @svgr/webpack 설정하고 import 해서 컴포넌트처럼 사용하고있는데요.이미지 파일을 public에 두고 사용중인데 svg 파일은 제가 찾아본바로는 이미지 파일이라기보다 html/css에 가깝고 컴포넌트처럼 import 해서 사용하면 이미지가 아니기때문에 public 폴더가 아닌 다른 폴더로 빼서 파일을 관리해야될것같은데 svg 파일은 어디에 두는게 좋은가요? public 폴더에 놔두고 사용하는게 좋은지 아니면 따로 assests 폴더등을 만들어서 따로 관리하는게 좋은지 궁금합니다. !
- 미해결[리뉴얼] React로 NodeBird SNS 만들기
loadPosts 에러
안녕하세요 선생님.무한스크롤링 강의까지 수강 했습니다. faker로 dummydata 만들어서 무한 스크롤링 구현했는데 중간에 뭘 잘못 건드렸는지 에러가 뜨네요..제 생각에는 아래의 에러 부분 문제 인거 같아서 post saga 부분과 reducer를 오랜 시간 봤는데 어디가 잘못 된건지 모르겠습니다... react_devtools_backend.js:2655 The above error occurred in task loadPosts created by throttle(LOAD_POSTS_REQUEST, loadPosts) created by watchLoadPosts created by postSaga created by rootSagaTasks cancelled due to error:throttle(LOAD_POSTS_REQUEST, loadPosts)watchAddPostwatchRemovePostwatchAddCommentuserSaga
- 미해결[리뉴얼] React로 NodeBird SNS 만들기
ADD_COMMENT_FAILURE 에러
error - ./sagas/post.jsAttempted import error: 'ADD_COMMENT_FAILURE' is not exported from '../reducers/post'.와 같이 오류 코드가 뜹니다. 간단한 문제인거 같은데 해결이 안되네요.아래는 두 코드입니다. ./reducer/post.jsimport shortId from 'shortid'; import faker from 'faker'; import produce from '../util/produce'; export const initialState = { mainPosts: [], imagePaths: [], hasMorePosts: true, loadPostsLoading: false, loadPostsDone: false, loadPostsError: null, addPostLoading: false, addPostDone: false, addPostError: null, removePostLoading: false, removePostDone: false, removePostError: null, addCommentLoading: false, addCommentDone: false, addCommentError: null, }; // -> index.js export const generateDummyPost = (number) => Array(number).fill().map(() => ({ id: shortId.generate(), User: { id: shortId.generate(), nickname: faker.name.findName(), }, content: faker.lorem.paragraph(), //아무런 글자 Images: [{ src: faker.image.image(), //공간만 차지할꺼면 placeholder }], Comments: [{ User: { id: shortId.generate(), nickname: faker.name.findName(), }, content: faker.lorem.sentence(), }], })); export const LOAD_POSTS_REQUEST = 'LOAD_POSTS_REQUEST'; export const LOAD_POSTS_SUCCESS = 'LOAD_POSTS_SUCCESS'; export const LOAD_POSTS_FAILURE = 'LOAD_POSTS_FAILURE'; export const ADD_POST_REQUEST = 'ADD_POST_REQUEST'; export const ADD_POST_SUCCESS = 'ADD_POST_SUCCESS'; export const ADD_POST_FAILURE = 'ADD_POST_FAILURE'; export const REMOVE_POST_REQUEST = 'REMOVE_POST_REQUEST'; export const REMOVE_POST_SUCCESS = 'REMOVE_POST_SUCCESS'; export const REMOVE_POST_FAILURE = 'REMOVE_POST_FAILURE'; export const ADD_COMMENT_REQUEST = 'ADD_COMMENT_REQUEST'; export const ADD_COMMENT_SUCCESS = 'ADD_COMMENT_SUCCESS'; export const ADD_COMMENT_FAILURE = 'ADD_COMMENT_FAILURE'; export const addPost = (data) => ({ type: ADD_POST_REQUEST, data, }); export const addComment = (data) => ({ type: ADD_COMMENT_REQUEST, data, }); const dummyPost = (data) => ({ id: data.id, content: data.content, User: { id: 1, nickname: '제로초', }, Images: [], Comments: [], }); const dummyComment = (data) => ({ id: shortId.generate(), content: data, User: { id: 1, nickname: '제로초', }, }); // 이전 상태를 액션을 통해 다음 상태로 만들어내는 함수(불변성은 지키면서) const reducer = (state = initialState, action) => produce(state, (draft) => { switch (action.type) { //state를 draft로 case LOAD_POSTS_REQUEST: draft.loadPostsLoading = true; //리퀘스트가 갔을때는 로딩 draft.loadPostsDone = false; draft.loadPostsError = null; break; case LOAD_POSTS_SUCCESS: draft.loadPostsLoading = false; draft.loadPostsDone = true; draft.mainPosts = action.data.concat(draft.mainPosts); //데이터합치기 draft.hasMorePosts = draft.mainPosts.length < 50; //50개로 제한 게시글 50개만 보겠다. break; case LOAD_POSTS_FAILURE: draft.loadPostsLoading = false; draft.loadPostsError = action.error; break; case ADD_POST_REQUEST: draft.addPostLoading = true; draft.addPostDone = false; draft.addPostError = null; break; case ADD_POST_SUCCESS: draft.addPostLoading = false; draft.addPostDone = true; draft.mainPosts.unshift(dummyPost(action.data)); break; case ADD_POST_FAILURE: draft.addPostLoading = false; draft.addPostError = action.error; break; case REMOVE_POST_REQUEST: draft.removePostLoading = true; draft.removePostDone = false; draft.removePostError = null; break; case REMOVE_POST_SUCCESS: draft.removePostLoading = false; draft.removePostDone = true; draft.mainPosts = draft.mainPosts.filter((v) => v.id !== action.data); break; case REMOVE_POST_FAILURE: draft.removePostLoading = false; draft.removePostError = action.error; break; case ADD_COMMENT_REQUEST: draft.addCommentLoading = true; draft.addCommentDone = false; draft.addCommentError = null; break; case ADD_COMMENT_SUCCESS: { const post = draft.mainPosts.find((v) => v.id === action.data.postId); post.Comments.unshift(dummyComment(action.data.content)); draft.addCommentLoading = false; draft.addCommentDone = true; break; // const postIndex = state.mainPosts.findIndex((v) => v.id === action.data.postId); // const post = { ...state.mainPosts[postIndex] }; // post.Comments = [dummyComment(action.data.content), ...post.Comments]; // const mainPosts = [...state.mainPosts]; // mainPosts[postIndex] = post; // return { // ...state, // mainPosts, // addCommentLoading: false, // addCommentDone: true, // }; } case ADD_COMMENT_FAILURE: draft.addCommentLoading = false; draft.addCommentError = action.error; break; default: break; } }); export default reducer;./sagas/post.jsimport axios from 'axios'; import shortId from 'shortid'; import { all, delay, fork, put, takeLatest, throttle } from 'redux-saga/effects'; import { ADD_COMMENT_FAILURE, ADD_COMMENT_REQUEST, ADD_COMMENT_SUCCESS, ADD_POST_FAILURE, ADD_POST_REQUEST, ADD_POST_SUCCESS, generateDummyPost, LOAD_POSTS_FAILURE, LOAD_POSTS_REQUEST, LOAD_POSTS_SUCCESS, REMOVE_POST_FAILURE, REMOVE_POST_REQUEST, REMOVE_POST_SUCCESS, } from '../reducers/post'; import { ADD_POST_TO_ME, REMOVE_POST_OF_ME } from '../reducers/user'; function loadPostsAPI(data) { return axios.get('/api/posts', data); } function* loadPosts(action) { try { // const result = yield call(loadPostsAPI, action.data); yield delay(1000); yield put({ type: LOAD_POSTS_SUCCESS, data: generateDummyPost(10), }); } catch (err) { console.error(err); yield put({ type: LOAD_POSTS_FAILURE, data: err.response.data, }); } } function addPostAPI(data) { return axios.post('/api/post', data); } function* addPost(action) { try { // const result = yield call(addPostAPI, action.data); yield delay(1000); //서버를 구현하기 전까지 딜레이로 구현하는 효과 const id = shortId.generate(); yield put({ type: ADD_POST_SUCCESS, data: { id, content: action.data, }, }); yield put({ type: ADD_POST_TO_ME, data: id, }); } catch (err) { console.error(err); yield put({ type: ADD_POST_FAILURE, data: err.response.data, }); } } function removePostAPI(data) { return axios.delete('/api/post', data); } function* removePost(action) { try { // const result = yield call(removePostAPI, action.data); yield delay(1000); yield put({ type: REMOVE_POST_SUCCESS, data: action.data, }); yield put({ type: REMOVE_POST_OF_ME, data: action.data, }); } catch (err) { console.error(err); yield put({ type: REMOVE_POST_FAILURE, data: err.response.data, }); } } function addCommentAPI(data) { return axios.post(`/api/post/${data.postId}/comment`, data); } function* addComment(action) { try { // const result = yield call(addCommentAPI, action.data); yield delay(1000); yield put({ type: ADD_COMMENT_SUCCESS, data: action.data, }); } catch (err) { yield put({ type: ADD_COMMENT_FAILURE, data: err.response.data, }); } } //takeevery function* watchLoadPosts() { yield throttle(5000, LOAD_POSTS_REQUEST, loadPosts); //5초동안은 post request 한 번만 실행 } function* watchAddPost() { //클릭 실수 2번했을때(동시에 로딩 중일때) 마지막 클릭만 실행되게 every는 두 번 다 실행 yield takeLatest(ADD_POST_REQUEST, addPost); } function* watchRemovePost() { yield takeLatest(REMOVE_POST_REQUEST, removePost); } function* watchAddComment() { yield takeLatest(ADD_COMMENT_REQUEST, addComment); } export default function* postSaga() { yield all([ fork(watchAddPost), fork(watchLoadPosts), fork(watchRemovePost), fork(watchAddComment), ]); }제로초님 강의와 깃허브 보면서 제 코드에 문제가 있는지 찾아보고 수정도 해봤습니다.import export둘다 잘 들어 갔는데 다른 문제 일까요? 아니면 install이 안된게 있는 걸까요?
- 미해결[리뉴얼] React로 NodeBird SNS 만들기
중복된 닉네임
중복된 닉네임할때 const exUser = await User.findOne({ where: { email: req.body.email, nickname: req.body.nickname, }, });이렇게 추가 해주면 되나요? 아니면 따로 만들어줘야하나요?
- 미해결[리뉴얼] React로 NodeBird SNS 만들기
프론트쪽에서 env 나누나요?
현재 강의 front쪽에서 env 로컬 배포 일떄도 나누나요?
- 미해결[리뉴얼] React로 NodeBird SNS 만들기
함께 아는 친구 기능 구현
다른 유저와 공통적으로 팔로잉을 하고 있는 유저 숫자를 구하고 싶은데 혹시 api를 어떤 방식으로 코딩하면 될까요? 항상 좋은강의 감사합니다
- 미해결[리뉴얼] React로 NodeBird SNS 만들기
다대다 관계 중간 테이블에서 find하기
포스트정보를 가져올 때 이렇게 좋아요를 가져오는데 좋아요에 대한 건 중간 테이블에서 가져오는게 아닌가요?as Likers는 단순히 user테이블의 이름만 바꾼다고 생각을 했습니다..좋아요 테이블은 따로 find로 접근을 할 수 없나요?
- 미해결[리뉴얼] React로 NodeBird SNS 만들기
models post.js nickname column 생성
안녕하세요 제로초쌤 유저의 게시글을 [id]로 받아오는건 잘 되는데유저의 게시글을 동적라우팅을 할때 유저의 닉네임을 넣어서 받아올려고 합니다!하지만 백엔드의 post.js의 column 형태가 아래와 같이 되어있어서nickname을 받아오게 하기 위해서 Posts DB안에 있던 게시글을 전부 지운뒤 models 의 post.js 안에 nickname관련 설정을 따로 넣었습니다.근데 저렇게 작성하면 백엔드에서는 nickname관련한 필드리스트를 찾을 수 없다고 해서 에러가 나더라구요혹시 post.js의 설정 중에서 어떤걸 건드려야 게시글 작성자의 nickname을 들어가게 할 수 있나요?
- 미해결[리뉴얼] React로 NodeBird SNS 만들기
리트윗 따로 관리 시 테이블 관계성 질문
안녕하세요 선생님.제 프로젝트에서는 리트윗 기능이 일반 게시글과 분리되어 관리되거든요.(리트윗만 모아서 보여주고 게시글과 한꺼번에 렌더링해서 보여주지 않습니다)그래서 처음에는 그냥 for문으로 리트윗 내용일 땐 렌더링 하지 않는 식으로 처리했다가제 프로젝트에서 mainPosts로 map함수를 쓰는 컴포넌트가 몇 개 돼서그냥 리트윗 테이블을 따로 만들어서 관리할까 하는데 이럴 때 post와의 관계성은db.Post.hasMany(db.Retweet);이런 식으로 잡아주면 되나요?
- 해결됨[리뉴얼] React로 NodeBird SNS 만들기
npm i next@13
강의를 보면서 잘 오다가 npm i next@9로 해야하는걸 아래 질문에서 13을 써도 된다고 하셔서 @13 이라고 했는데 저렇게 에러 3줄이 next@9을 할 때 도 저렇게 뜨고 13으로 해도 저렇게 뜹니다 package.json 뜨는 것 까진 잘 됐어요 어떻게 해야할까요? PS C:\Users\USER\Desktop\1080\react1> cd preparePS C:\Users\USER\Desktop\1080\react1\prepare> cd frontPS C:\Users\USER\Desktop\1080\react1\prepare\front> node -v v18.14.0PS C:\Users\USER\Desktop\1080\react1\prepare\front> npm -v6.9.0PS C:\Users\USER\Desktop\1080\react1\prepare\front> npm initnpm WARN npm npm does not support Node.js v18.14.0npm WARN npm You should probably upgrade to a newer version of node as wenpm WARN npm can't make any promises that npm will work with this version.npm WARN npm Supported releases of Node.js are the latest release of 6, 8, 9, 10, 11, 12.npm WARN npm You can find the latest version at https://nodejs.org/This utility will walk you through creating a package.json file.It only covers the most common items, and tries to guess sensible defaults.See npm help json for definitive documentation on these fieldsand exactly what they do.Use npm install <pkg> afterwards to install a package andsave it as a dependency in the package.json file.Press ^C at any time to quit.package name: (front) react-nodebird-frontversion: (1.0.0)description:entry point: (index.js)test command:git repository:keywords:author:license: (ISC)About to write to C:\Users\USER\Desktop\1080\react1\prepare\front\package.json:{ "name": "react-nodebird-front", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC"}Is this OK? (yes) yesPS C:\Users\USER\Desktop\1080\react1\prepare\front> npm i next@13npm WARN npm npm does not support Node.js v18.14.0npm WARN npm You should probably upgrade to a newer version of node as wenpm WARN npm can't make any promises that npm will work with this version.npm WARN npm Supported releases of Node.js are the latest release of 6, 8, 9, 10, 11, 12.npm WARN npm You can find the latest version at https://nodejs.org/npm ERR! cb.apply is not a functionnpm ERR! A complete log of this run can be found in:npm ERR! C:\Users\USER\AppData\Roaming\npm-cache\_logs\2023-02-14T14_50_16_126Z-debug.logPS C:\Users\USER\Desktop\1080\react1\prepare\front>
- 해결됨[리뉴얼] React로 NodeBird SNS 만들기
node -v v.18.14.0
node -v 쳤을 시 버전이 v18.14.0 으로 뜨는데 그대로 진행해도 괜찮은 건가요