묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
소셜로그인 43:30
제 본인 프로젝트에 해당되는 내용입니다.구글인증까지는 무난하게 되는데요.1. 파란색이 Entity() 에서 뽑아온 Column명에 해당하는 변수로 알고 있습니다. 2. 구글인증을 통과한 후에 name, email, password를 req.user로 넣어서 보내주는 걸로 알고 있습니다. <질문의도>name, email, password를 req.user객체에 넣어서 받았으니, req.user.name,req.user.email,req.user.password,데이터를 꺼내서 개별적으로컬럼에 저장되는 변수에userName = req.user.nameuserEmail = req.user.emailuserPassword = req.user.password위와 같이 저장되어야 하지 않아 생각해 봅니다. 그런데 아래 오류메시지의 경우<property 'email' does not exist on type 'User & Pick<User, userEmail, userName, userPassword>↑왜(why) req.user에서 userEmail, userName,userPassword를 찾고 있는지 이해가 가지 않습니다.----------------------------------------------------------제가 지금 머릿속에서 뭔가 꼬인 것 같습니다.답변 부탁드릴께요.진도를 못나가고 있어요ㅠ
-
미해결[리뉴얼] 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);이런 식으로 잡아주면 되나요?
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 레딧 사이트 만들기(NextJS)(Pages Router)
typeorm @Index()에 궁금한거 질문 드립니다!
export default class User extends BaseEntity{ ... @Index() @Column({ unique: true}) email:string; ... }여기에서 다루는 이 코드와@Unique(['email']) export default class User extends BaseEntity{ ... @Column() email:string; ... }두가지가 어떤 차이가 있는걸까요...? 너무 궁금 합니다!
-
미해결비전공자를 위한 진짜 입문 올인원 개발 부트캠프
Github 인증 에러 뜨시는 분들 참고해주세요.
Github에서 레지토리에 등록하실 때 아래와 같이 인증오류 뜨시는 분들 참고해주시면 좋을 것 같아요.remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.해당 오류는 Github에서 2021년 Aug 13일부터 인증 방식이 비밀번호에서 토큰값을 입력하는 방식으로 변경이 되었는데요.해결방법은 비밀번호를 쓰지 않고, 토큰 값을 입력하시면 간단하게 해결이 가능합니다.Username : Github ID (이름이 아닌 로그인 할 때 적는 ID 입력)Password : 토큰 값 입력 그렇다면 토큰이 뭐냐? 개개인의 인증에 쓰이는 고유한 값인데요 (ex. ghp_tA0QVuK5zoectiJ6bgbD...) 등토큰은 어떻게 만들어서 입력하는데요? 아래 링크를 확인해주세요.https://dev.classmethod.jp/articles/resolving-github-token-authentication-errors/그리고 Password에 토큰값을 입력해주시면 정상적으로 push가 됩니다.끝.
-
해결됨비전공자를 위한 진짜 입문 올인원 개발 부트캠프
4092 Error
8080으로 안되서 검색해서 이것저것 해봐도 안되길래 8090으로 하니까 되는데 8090을 써도 상관 없나요?
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
N:N 구현 시, update 부분에서 컴파일 에러가 납니다.
async update({ productId: id, updateProductInput }: { productId: string, updateProductInput: UpdateProductInput }) { const beforeProduct = await this.findOne(id); const updatedProduct = { ...beforeProduct, id, //덮어쓰기 ...updateProductInput, // 덮어쓰기 }; return await this.productRepository.save(updatedProduct); } 위는 코드부입니다.일단 영상에서 update부분을 만진거 같지는 않은데, 여기서 updateProductInput의 productTags가 string 타입 배열이라 저장 시 충돌이 일어나네요. 태그 생성부분을 따로 메서드 추출을 해야할까요?
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
게시판 리스트 최초 접속시 로딩시간이 너무 오래 걸립니다
최초 접속시 10초가 넘는 로딩시간이 걸립니다.왜 그런지 알 수 있을까요? 그 이후로는 빠르게 동작합니다.
-
해결됨탄탄한 백엔드 NestJS, 기초부터 심화까지
좋지 않은 예 에서 import
테스트를 잠깐 해 보았는데요.다른 모듈에있는 Service를 사용하기 위해서는 (지금까지 배운 내용에 한해서)1. B Module 에 A Module , A Service 등록하기. 2. B Module 에 A Service 만 등록하기 3. A Module 에서 A Service 를 exports 에 등록하고, B Module에서는 A Module 을 등록하기 정도 생각이 들었고 테스트 해 보았습니다.강사님꼐서는 1번과 3번을 예시로 들어주셨는데요, 좋지않은 예시(1번) 에서CatsModule 까지 import 한 이유가 있을까요? AppModule에 CatsModule을 import 하지 않고, CatsService 만 providers 에 등록해 준 것과 다른가요? 아니면, 2번 에서 암시적으로 A Module이 import된다거나 하는게 있는건가요? ++ 인스턴스 가 새로 생성되는 것이라면, 서버사이드에서 는 굳이 싱글톤이 아니어도 될 인스턴스 객체들이 많을 것이라 보이는데, 다른 이유가 있나요?
-
미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
mysql 설치는 윈도우에 대해서만 해주는 것인가요?
해당 강좌는 윈도우 기반인가요?설치에 대해서 윈도우만 설명하고 있어서 글을 적어보았습니다.
-
해결됨[리뉴얼] 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 으로 뜨는데 그대로 진행해도 괜찮은 건가요
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
accessToken 만료시 어떻게 해야하나요..?
강의는 hydration 들으면서 실습하던중으로, 게시글 등록시해당 에러가 발생하는데, 토큰 만료는 어느 부분을 놓친지 모르겠습니다.짐작건데, accessToken store쪽을 잘못저장해놨나 싶어서 캡쳐해봤습니다.
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
Expected server HTML to contain a matching <header> in <div>.
회원가입이나 로그인 후 주소가http://localhost:3000/login? 이나http://localhost:3000/signUp? 으로 이동해지며, url 뒤에 물음표가 붙습니다. 가끔 Failed to fetch 메시지가 뜨는것은 너무 많이 요청을 보내서 그런것같습니다만, 그것과 무관하게 아래의 이슈가 사라지지 않습니다. 지금 학습단계에서 임시로 사용하기로한 로컬스토리지때문에 발생한 이슈일까요? import React, { useEffect } from 'react'; import { ApolloLink, ApolloClient, ApolloProvider, InMemoryCache } from '@apollo/client'; import { createUploadLink } from 'apollo-upload-client' import { useRecoilState } from 'recoil'; import { accessTokenState } from '@/src/commons/store'; interface Props { children: JSX.Element; } const GLOBAL_STATE = new InMemoryCache() const ApolloSetting = (props: Props) => { const [accessToken, setAccessToken] = useRecoilState(accessTokenState) useEffect(() => { if (localStorage.getItem("accessToken")) { setAccessToken(localStorage.getItem("accessToken") ?? "") } }, []) const uplodLink = createUploadLink({ uri: "http://backendonline.codebootcamp.co.kr/graphql", headers: { Authorization: `Bearer ${accessToken}` } }) const client = new ApolloClient({ link: ApolloLink.from([uplodLink as unknown as ApolloLink]), cache: GLOBAL_STATE }); return <ApolloProvider client={client}>{props.children}</ApolloProvider>; }; export default ApolloSetting; import { Title } from '@/src/commons/styles/emotion' import * as S from './Login_styles' import React, { useEffect, useState } from 'react' import { useMutation } from '@apollo/client' import { type IMutation, type IMutationLoginUserArgs } from '@/src/commons/types/generated/types' import { LOGIN_USER } from './Login_query' import { Modal } from 'antd' import { useRouter } from 'next/router' import { useRecoilState } from 'recoil' import { accessTokenState } from '@/src/commons/store' const Login_presenter = () => { const [accessToken, setAccessToken] = useRecoilState(accessTokenState) const router = useRouter() const [input, setInput] = useState({ email: '', password: '', }) const onChangeInput = (e: React.ChangeEvent<HTMLInputElement>) => { setInput({ ...input, [e.currentTarget.id]: e.currentTarget.value }) } const [loginUser] = useMutation<Pick<IMutation, 'loginUser'>, IMutationLoginUserArgs>(LOGIN_USER); const onSubmitSignUp = async () => { if (!input.email.includes("@") || !input.email.includes(".")) { Modal.error({ content: "이메일이 유효하지 않습니다." }); return } if (input.email && input.password) { try { const result = await loginUser({ variables: { email: input.email, password: input.password } }); if (!result.data) { Modal.error({ content: "로그인에 실패하였습니다." }); return } const accessToken = result.data?.loginUser.accessToken if (setAccessToken) { setAccessToken(accessToken || "") // 3. 로그인 성공페이지로 이동하기 void router.push('/') localStorage.setItem("accessToken", accessToken) // 임시로 사용 나중에 지울예정 } } catch (error) { if (error instanceof Error) { alert(error.message) } } } } return ( <S.LoginForm> <Title style={{ color: '#fff', "textAlign": "center", "marginBottom": "20px" }}>로그인</Title> <S.InputContainer> <S.Label htmlFor='email'>이메일</S.Label> <S.Input id='email' placeholder='이메일을 입력해주세요.' onChange={onChangeInput} /> </S.InputContainer> <S.InputContainer> <S.Label htmlFor='password'>비밀번호</S.Label> <S.Input id='password' placeholder='비밀번호를 입력해주세요.' onChange={onChangeInput} autoComplete="on" type='password' /> </S.InputContainer> <S.SubmitButton onClick={onSubmitSignUp}>로그인</S.SubmitButton> </S.LoginForm> ) } export default Login_presenterimport { accessTokenState } from '@/src/commons/store'; import { type IQuery } from '@/src/commons/types/generated/types'; import { gql, useQuery } from '@apollo/client'; import * as S from './Header_style' import { useRouter } from 'next/router'; import { useRecoilState } from 'recoil'; import { useEffect, useState } from 'react'; const FETCH_USER_LOGGED_IN = gql` query fetchUserLoggedIn { fetchUserLoggedIn{_id picture email name} } `; const Header = () => { const [accessToken] = useRecoilState(accessTokenState) const [isMounted, setIsMounted] = useState(false) const router = useRouter(); useEffect(() => { setIsMounted(true) }, []) const { data } = useQuery<Pick<IQuery, 'fetchUserLoggedIn'>>(FETCH_USER_LOGGED_IN); const onClickLogout = () => { if (localStorage) { localStorage.removeItem("accessToken") router.reload() } } return ( <S.Header> <S.Logo onClick={async () => await router.push(`/boards`)}> 🚢 FREE BOARD </S.Logo> {isMounted && <S.HeaderButtons> {!accessToken && <S.Login onClick={() => { void router.push(`/login`) }}>로그인</S.Login>} {!accessToken && <S.Signup onClick={async () => await router.push(`/signUp`)}>회원가입</S.Signup>} {accessToken && <S.Login onClick={onClickLogout}>로그아웃</S.Login>} {accessToken && <div>{data?.fetchUserLoggedIn.name}</div>} {accessToken && <div>{data?.fetchUserLoggedIn.email}</div>} {data?.fetchUserLoggedIn.picture && <img src={data?.fetchUserLoggedIn.picture}></img>} </S.HeaderButtons>} </S.Header> ); }; export default Header;
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
PostHashtag테이블
PostHashtag(Post와 Hashtag 중간 테이블)에서 findAll을 해서 hashtag이름 까지 가지고 오는 방법이 있을 까요? 지금은 해쉬태그 Id까지밖에 가지고 오지 못해서요
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
npm run dev의 에러
안녕하세요 2023년에 강의를 듣는중입니다. Next와 React의 버전은 강의와 같고 Node Js 버전은 v18.13.0 인상태로 npm run dev를 실행하면> react-nodebird-front@1.0.0 dev> nextBrowserslist: caniuse-lite is outdated. Please run:npx browserslist@latest --update-dbready - started server on http://localhost:3000node:internal/crypto/hash:71 this[kHandle] = new _Hash(algorithm, xofLen); ^Error: error:0308010C:digital envelope routines::unsupported at new Hash (node:internal/crypto/hash:71:19) at Object.createHash (node:crypto:133:10) at module.exports (/Users/user/Desktop/Folders/Programming 2/zerocho/nodebird/prepare/front/node_modules/webpack/lib/util/createHash.js:135:53) at NormalModule._initBuildHash (/Users/user/Desktop/Folders/Programming 2/zerocho/nodebird/prepare/front/node_modules/webpack/lib/NormalModule.js:417:16) at handleParseError (/Users/user/Desktop/Folders/Programming 2/zerocho/nodebird/prepare/front/node_modules/webpack/lib/NormalModule.js:471:10) at /Users/user/Desktop/Folders/Programming 2/zerocho/nodebird/prepare/front/node_modules/webpack/lib/NormalModule.js:503:5 at /Users/user/Desktop/Folders/Programming 2/zerocho/nodebird/prepare/front/node_modules/webpack/lib/NormalModule.js:358:12 at /Users/user/Desktop/Folders/Programming 2/zerocho/nodebird/prepare/front/node_modules/loader-runner/lib/LoaderRunner.js:373:3 at iterateNormalLoaders (/Users/user/Desktop/Folders/Programming 2/zerocho/nodebird/prepare/front/node_modules/loader-runner/lib/LoaderRunner.js:214:10) at Array.<anonymous> (/Users/user/Desktop/Folders/Programming 2/zerocho/nodebird/prepare/front/node_modules/loader-runner/lib/LoaderRunner.js:205:4) { opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ], library: 'digital envelope routines', reason: 'unsupported', code: 'ERR_OSSL_EVP_UNSUPPORTED'}에러가 나오네요 chatGPT에게 물어보면 npx browserslist@latest --update-db 로 라이브러리를 업데이트 해라고 나와서 따라 했지만 여전히 같은 에러가 나왔습니다. 그러나 왠지 Node 의 버전이 문제일거같아서 12.17.0으로 낮춰서 npm run dev를 해보니 작동이 되었습니다. Node의 버전이 문제라면 에러메시지에 Node의 버전이 문제라고 나와야한다고 생각하는데 저런 에러가 나온 이유는 뭘까요???Node의 버전 문제인데 이 메세지라면 에러 메세지대로 해결 할 수 없는것 아닌가요?
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
apollo 셋팅하는 부분이 어느쪽인가요?
해당강의 찾아봐도 셋팅하는 부분은 안나오고그냥 설치시 버전 오류가 발생합니다.
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
혹시 section quiz에 대한 정답은 어디 있나요..?
위의 사진은 section2 quiz입니다.section별 quiz 정답을 못찾겟네요!!고난도는 답이 따로 없다고는 기억 하고있는데 고난도를 제외한 문제들의 정답들은 어디있나요? ㅎㅎ
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
Entity 구현 - 1: N, N : M 이 강의10분 13초에서
안녕하세요.위 파일은 product.entity.ts 파일입니다.product.entity.ts 파일에서 @JoinColumn() 을 productSaleslocation 테이블에만 해주시는 이유가 무엇인지 알 수 있을까요?product테이블과 서로 관계를 맺고 있는 productSaleslocation 테이블과 users 테이블에도 @JoinColumn()을 해줘야 하는 것 아닌가요?상품테이블은productCategory테이블과(상품카테고리_id)ManyToOne 관계를 맺고 있으며, User 테이블과 (유저_id) ManyToOne 관계를 맺고 있어서 각각 JoinColumn을 해줘야 하는 것으로 생각했는데, 제 생각이 틀린 것일까요?좋은 강의 해주셔서 진심으로 감사합니다!