묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨맛집 지도앱 만들기 (React Native + NestJS)
sudo gem install cocoapods 오류 [해결 방법]
[오류]ERROR: Error installing cocoapods: The last version of drb (>= 0) to support your Ruby & RubyGems was 2.0.6. Try installing it with gem install drb -v 2.0.6 and then running the current command again drb requires Ruby version >= 2.7.0. The current ruby version is 2.6.10.210. 오류: Cocoapod 설치 오류: Ruby 및 RubyGems를 지원하는 drb(>= 0)의 마지막 버전은 2.0.6입니다. gem install drb -v 2.0.6으로 설치한 후 현재 명령을 다시 실행해 보세요. drb에는 Ruby 버전 >= 2.7.0이 필요합니다. 현재 루비 버전은 2.6.10.210입니다. [오류]ERROR: Error installing cocoapods: The last version of activesupport (>= 5.0, < 8) to support your Ruby & RubyGems was 6.1.7.7. Try installing it with gem install activesupport -v 6.1.7.7 and then running the current command again activesupport requires Ruby version >= 2.7.0. The current ruby version is 2.6.10.210. 오류: Cocoapod 설치 오류: Ruby & RubyGems를 지원하는 마지막 activesupport 버전(>= 5.0, < 8)은 6.1.7.7입니다. gem install activesupport -v 6.1.7.7을 사용하여 설치한 후 현재 명령을 다시 실행해 보세요. activesupport에는 Ruby 버전 >= 2.7.0이 필요합니다. 현재 루비 버전은 2.6.10.210입니다.
-
해결됨맛집 지도앱 만들기 (React Native + NestJS)
forward 수업에서 키보드가 보이지 않는 문제발생
inputField 에서 TextInput 안에 ref를 넣고 병합하면서 부터 키보드가 아예 나타나지 않고 있습니다.로그인과 회원가입 화면 모두에서 키보드가 나타나지 않는것을 보니 input 여기 문제인것 같은데 오류를 못찾고 있네요. 확인 해주실수 있을까요? 감사합니다.https://github.com/happyssun/FoodsMap
-
해결됨맛집 지도앱 만들기 (React Native + NestJS)
카카오 로그인 관련 Webview 질문드립니다.
안녕하세요. Webview 관련해서 다시 질문드립니다. import axios from 'axios'; import React, {useState} from 'react'; import { ActivityIndicator, Dimensions, Platform, StyleSheet, Text, View, } from 'react-native'; import {SafeAreaView} from 'react-native-safe-area-context'; import WebView, { WebViewMessageEvent, WebViewNavigation, } from 'react-native-webview'; import useAuth from '../../hooks/queries/useAuth'; import Config from 'react-native-config'; import {authNavigations, colors} from '../../constants'; import {AuthStackParamList} from '../../navigations/stack/AuthStackNavigator'; import {NativeStackScreenProps} from '@react-navigation/native-stack'; const REDIRECT_URI = `{배포된 SERVER의 REDIRECT URI}` type AuthHomeScreenProps = NativeStackScreenProps<AuthStackParamList>; function KakaoLoginScreen({navigation}: AuthHomeScreenProps) { const {kakoLoginMutation} = useAuth(); const [isLoading, setIsLoading] = useState(false); const [isChangeNavigate, setIsChangeNavigate] = useState(true); const handleOnMessage = (event: WebViewMessageEvent) => { if (event.nativeEvent.url.includes(`${REDIRECT_URI}?code=`)) { const code = event.nativeEvent.url.replace(`${REDIRECT_URI}?code=`, ''); requestToken(code); // navigation.navigate(authNavigations.MAINBOTTOMTABNAVIGATOR, {code}); navigation.navigate(authNavigations.MAINBOTTOMTABNAVIGATOR); } }; const requestToken = async (code: string) => { const response = await axios({ method: 'post', url: 'https://kauth.kakao.com/oauth/token', params: { grant_type: 'authorization_code', client_id: Config.KAKAO_REST_API_KEY, redirect_uri: REDIRECT_URI, code, }, }); console.log('response.data', response.data); kakoLoginMutation.mutate(response.data.access_token); }; // 로딩 처리 const handleNavigationChangeState = (event: WebViewNavigation) => { const isMatched = event.url.includes(`${REDIRECT_URI}?code=`); setIsLoading(isMatched); setIsChangeNavigate(event.loading); }; return ( <SafeAreaView style={styles.container}> {(isLoading || isChangeNavigate) && ( <View style={styles.kakaoLoadingContainer}> <ActivityIndicator size={'small'} color={colors.BLACK} /> </View> )} <WebView source={{ uri: `https://kauth.kakao.com/oauth/authorize?response_type=code&client_id=${Config.KAKAO_REST_API_KEY}&redirect_uri=${REDIRECT_URI}`, }} onMessage={handleOnMessage} injectedJavaScript={"window.ReactNativeWebView.postMessage('')"} onNavigationStationChange={handleNavigationChangeState} /> </SafeAreaView> ); } const styles = StyleSheet.create({ container: { flex: 1, }, kakaoLoadingContainer: { backgroundColor: colors.WHITE, height: Dimensions.get('window').height, alignItems: 'center', justifyContent: 'center', }, }); export default KakaoLoginScreen; 위와 같은 KakaologinScreen.tsx 코드에서 Webview 내의 source 부분에 RESTFULAPI_KEY 부분과 REDIRECT_URI를 넣고 강의에서처럼 카카오 로그인을 시도하였는데, 카카오 로그인 창이 뜨지 않고 계속 로딩 중인 상태입니다. 그래서 Webview 컴포넌트 source부분의 uri를 따로 때어서 웹 페이지에서 접속을 해보았는대로 아이디/비밀번호 입력창이 뜨지 않고 하얀색 공백창만 뜨는 상태입니다. 이와 같은 경우, 배보된 서버의 REDIRECT_URI의 문제인가요? 아니면 다른 부분에서 문제가 발생하는지 질문 드립니다. ❗질문 작성시 참고해주세요최대한 상세히 현재 문제(또는 에러)와 코드(또는 github)를 첨부해주셔야 그만큼 자세히 답변드릴 수 있습니다.맥/윈도우, 안드로이드/iOS, 버전 등의 개발환경도 함께 적어주시면 도움이 됩니다. 에러메세지는 일부분이 아닌 전체 상황을 올려주세요!
-
해결됨맛집 지도앱 만들기 (React Native + NestJS)
code ~/.zshrc 오류
안녕하세요 강사님진행 과정에 아래 2가지 문제가 있어서 문의드립니다구글 검색해서 해결하려고 했는데 점점 더 꼬여가네요..명령어 실행 과정 이미지 첨부드립니다감사합니다 1) code ~/.zshrc, code ~/.bash_profile 명령어 실행 시 오류2) 터미널 재실행 시 python이 자동으로 실행되는 오류
-
미해결[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core
posts 테이블에 authorId 컬럼값의 이름은 자동으로 생성되는건가요?
항상 좋은 강의 감사합니다. 강의를 들으며 궁금했던 부분은 제가 따로 테이블 컬럼이름을 설정해준 적이 없는데 자동으로 columnId값으로 지정된 부분입니다.현재 제 추측으로는 async createPost(authorId: number, title: string, content: string) { const post = this.postsRepository.create({ author: { id: authorId, }, title, content, likeCount: 0, commentCount: 0, }); const newPost = await this.postsRepository.save(post); return newPost; }해당 부분에서 create의인자로 받는 author 부분에서 key 값인 id를 확인해서 자동적으로 authorId라는 값이 만들어진건가 추측해보고 있는데 혹시 제 추측이 맞을까요?
-
해결됨맛집 지도앱 만들기 (React Native + NestJS)
현직 백엔드 개발자입니다
항상 백엔드 관련 인강만 구매했었는데취미가 필요해서 구매한 첫 프론트 인강입니다.벌써부터 신나네요답변 빠르다는 소문 듣고 왔습니다잘부탁드릴게요
-
해결됨맛집 지도앱 만들기 (React Native + NestJS)
ios. 재빌드후 icon 문제
빌드 에러가 나서 cd ios rm -rf Podfile.lock Podscd .. npx pod-install ios 처리후 다시 yarn ios 로 실행을 했는데요 그이후 a 로 안드로이드도실행했구요 이후에 ios 에서 icon이 나오지않는 문제가 생겼습니다. 그전에는 정상적으로 icon이 나왔었거든요 ios info.plist에도 해당 ttf 다 잘 들어있고 재빌드전까진 icon이 잘 나왔는데 어디를 살펴봐야할지 조언을 구합니다.
-
미해결[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core
findAndCount 함수에서 왜 count가 0이 아닌 값들은 제외 되었는지 궁금합니다.
const userAndCount = await this.userRepository.findAndCount({ take: 3, }); 위 와 같은 코드에서 결과 값으로 count가 변경 되어 있는 id 1,3의 값은 왜 가져오지 않았는지 궁금합니다!
-
해결됨맛집 지도앱 만들기 (React Native + NestJS)
yarn start 문제
안녕하세요 강사님 강의 잘 듣고 있습니다.다름이 아니라 yarn start + i 를 누르면 xcode가 자동 실행돼서 에뮬레이터가 잘 보이지만 yarn start + a를 실행하면 이미지와 같은 에러가 발생하네요.안드로이드 스튜디오를 실행하고 device manager에서 device run 하면 에러가 발생하진 않아요. 하지만 수동으로 계속 켜야하는 번거로움이 있네요..ㅠ 안드로이드 스튜디오도 xcode처럼 yarn start + a를 하면 자동으로 실행될 수 있도록 하는 방법이 있을까요?
-
해결됨맛집 지도앱 만들기 (React Native + NestJS)
소스코드 파일 질문
안녕하세요.강의에 쓰시는 이미지 파일 등을 가져오기 위해 소스코드 수업 자료를 다운받았는데 서버쪽 파일만 있는것 같습니다. 프론트엔드쪽 소스나 assets폴더에 있는 파일을 다운받으려면 어떻게 해야하는지 말씀 주시면 감사하겠습니다.
-
미해결[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core
relation option "nullable : false" 로 설정했는데, 테이블에 insert가 되고 있습니다.
안녕하세요 선생님~위와 같이 세팅해서user/profile로 post 요청을 보내면 500 에러가 나야하는걸로 알고 있는데,이처럼 잘 들어가 버리네요ㅜ`users` 로 get요청을 보내도 profile이 null이 들어간 상태로 조회됩니다.개발환경 버전도 올려드립니다~
-
미해결[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core
docker-compose yaml 파일 깃 업로드
안녕하세요 코팩님 nestjs/config 모듈과 process.env 를 이용해서 환경변수 파일을 작성하고 환경변수를 불러오고 하잖아요. 그런데 docker-compose.yaml 파일에도 db password나 이런게 존재하는데, docker-compose 파일은 깃허브에 보통 포함을 안 하나요?
-
해결됨맛집 지도앱 만들기 (React Native + NestJS)
회원가입시 QueryFailedError 에러
회원가입시 이러한 에러가 계속 발생합니다. console.log로test@test.com qwer1234 email, password는 들어가는것도 확인했고 auth/signup error를 catch했을땐 409code로 에러가 들어왔습니다.무엇이 문제일까요...?중복이 문제인가 싶어 다른 여러 아이디로도 해봤는데 계속해서 저러한 에러가 뜨면서 실패하고있습니다ㅜㅜ QueryFailedError: duplicate key value violates unique constraint "UQ_e12875dfb3b1d92d7d7c5377e22" at PostgresQueryRunner.query (/Users/kwonbeomjun/Documents/rn/rn-baro_review-v1/server/src/driver/postgres/PostgresQueryRunner.ts:331:19) at processTicksAndRejections (node:internal/process/task_queues:95:5) at InsertQueryBuilder.execute (/Users/kwonbeomjun/Documents/rn/rn-baro_review-v1/server/src/query-builder/InsertQueryBuilder.ts:163:33) at SubjectExecutor.executeInsertOperations (/Users/kwonbeomjun/Documents/rn/rn-baro_review-v1/server/src/persistence/SubjectExecutor.ts:435:42) at SubjectExecutor.execute (/Users/kwonbeomjun/Documents/rn/rn-baro_review-v1/server/src/persistence/SubjectExecutor.ts:137:9) at EntityPersistExecutor.execute (/Users/kwonbeomjun/Documents/rn/rn-baro_review-v1/server/src/persistence/EntityPersistExecutor.ts:182:21) at AuthService.signup (/Users/kwonbeomjun/Documents/rn/rn-baro_review-v1/server/src/auth/auth.service.ts:43:7) at /Users/kwonbeomjun/Documents/rn/rn-baro_review-v1/server/node_modules/@nestjs/core/router/router-execution-context.js:46:28 at /Users/kwonbeomjun/Documents/rn/rn-baro_review-v1/server/node_modules/@nestjs/core/router/router-proxy.js:9:17 { query: 'INSERT INTO "user"("loginType", "email", "password", "nickname", "imageUri", "kakaoImageUri", "RED", "YELLOW", "GREEN", "BLUE", "PURPLE", "createdAt", "updatedAt", "deletedAt", "hashedRefreshToken") VALUES ($1, $2, $3, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT) RETURNING "id", "RED", "YELLOW", "GREEN", "BLUE", "PURPLE", "createdAt", "updatedAt", "deletedAt"', parameters: [ 'email', 'test@test.com', '$2a$10$hlFtQkbll6R0pJNkTywGh.DaRGVm1uhu9DJm9c.Q0OeduuMRzdNyK' ], driverError: error: duplicate key value violates unique constraint "UQ_e12875dfb3b1d92d7d7c5377e22" at /Users/kwonbeomjun/Documents/rn/rn-baro_review-v1/server/node_modules/pg/lib/client.js:526:17 at processTicksAndRejections (node:internal/process/task_queues:95:5) at PostgresQueryRunner.query (/Users/kwonbeomjun/Documents/rn/rn-baro_review-v1/server/src/driver/postgres/PostgresQueryRunner.ts:260:25) at InsertQueryBuilder.execute (/Users/kwonbeomjun/Documents/rn/rn-baro_review-v1/server/src/query-builder/InsertQueryBuilder.ts:163:33) at SubjectExecutor.executeInsertOperations (/Users/kwonbeomjun/Documents/rn/rn-baro_review-v1/server/src/persistence/SubjectExecutor.ts:435:42) at SubjectExecutor.execute (/Users/kwonbeomjun/Documents/rn/rn-baro_review-v1/server/src/persistence/SubjectExecutor.ts:137:9) at EntityPersistExecutor.execute (/Users/kwonbeomjun/Documents/rn/rn-baro_review-v1/server/src/persistence/EntityPersistExecutor.ts:182:21) at AuthService.signup (/Users/kwonbeomjun/Documents/rn/rn-baro_review-v1/server/src/auth/auth.service.ts:43:7) at /Users/kwonbeomjun/Documents/rn/rn-baro_review-v1/server/node_modules/@nestjs/core/router/router-execution-context.js:46:28 at /Users/kwonbeomjun/Documents/rn/rn-baro_review-v1/server/node_modules/@nestjs/core/router/router-proxy.js:9:17 { length: 234, severity: 'ERROR', code: '23505', detail: 'Key (email)=(test@test.com) already exists.', hint: undefined, position: undefined, internalPosition: undefined, internalQuery: undefined, where: undefined, schema: 'public', table: 'user', column: undefined, dataType: undefined, constraint: 'UQ_e12875dfb3b1d92d7d7c5377e22', file: 'nbtinsert.c', line: '670', routine: '_bt_check_unique' }, length: 234, severity: 'ERROR', code: '23505', detail: 'Key (email)=(test@test.com) already exists.', hint: undefined, position: undefined, internalPosition: undefined, internalQuery: undefined, where: undefined, schema: 'public', table: 'user', column: undefined, dataType: undefined, constraint: 'UQ_e12875dfb3b1d92d7d7c5377e22', file: 'nbtinsert.c', line: '670', routine: '_bt_check_unique' } QueryFailedError: duplicate key value violates unique constraint "UQ_e12875dfb3b1d92d7d7c5377e22" at PostgresQueryRunner.query (/Users/kwonbeomjun/Documents/rn/rn-baro_review-v1/server/src/driver/postgres/PostgresQueryRunner.ts:331:19) at processTicksAndRejections (node:internal/process/task_queues:95:5) at InsertQueryBuilder.execute (/Users/kwonbeomjun/Documents/rn/rn-baro_review-v1/server/src/query-builder/InsertQueryBuilder.ts:163:33) at SubjectExecutor.executeInsertOperations (/Users/kwonbeomjun/Documents/rn/rn-baro_review-v1/server/src/persistence/SubjectExecutor.ts:435:42) at SubjectExecutor.execute (/Users/kwonbeomjun/Documents/rn/rn-baro_review-v1/server/src/persistence/SubjectExecutor.ts:137:9) at EntityPersistExecutor.execute (/Users/kwonbeomjun/Documents/rn/rn-baro_review-v1/server/src/persistence/EntityPersistExecutor.ts:182:21) at AuthService.signup (/Users/kwonbeomjun/Documents/rn/rn-baro_review-v1/server/src/auth/auth.service.ts:43:7) at /Users/kwonbeomjun/Documents/rn/rn-baro_review-v1/server/node_modules/@nestjs/core/router/router-execution-context.js:46:28 at /Users/kwonbeomjun/Documents/rn/rn-baro_review-v1/server/node_modules/@nestjs/core/router/router-proxy.js:9:17 { query: 'INSERT INTO "user"("loginType", "email", "password", "nickname", "imageUri", "kakaoImageUri", "RED", "YELLOW", "GREEN", "BLUE", "PURPLE", "createdAt", "updatedAt", "deletedAt", "hashedRefreshToken") VALUES ($1, $2, $3, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT) RETURNING "id", "RED", "YELLOW", "GREEN", "BLUE", "PURPLE", "createdAt", "updatedAt", "deletedAt"', parameters: [ 'email', 'test@test.com', '$2a$10$DfBqqh82WjRRFN5Fj2zJu.RiqJzzJCD4vR5xA1.y2zRxaAol0pP6W' ], driverError: error: duplicate key value violates unique constraint "UQ_e12875dfb3b1d92d7d7c5377e22" at /Users/kwonbeomjun/Documents/rn/rn-baro_review-v1/server/node_modules/pg/lib/client.js:526:17 at processTicksAndRejections (node:internal/process/task_queues:95:5) at PostgresQueryRunner.query (/Users/kwonbeomjun/Documents/rn/rn-baro_review-v1/server/src/driver/postgres/PostgresQueryRunner.ts:260:25) at InsertQueryBuilder.execute (/Users/kwonbeomjun/Documents/rn/rn-baro_review-v1/server/src/query-builder/InsertQueryBuilder.ts:163:33) at SubjectExecutor.executeInsertOperations (/Users/kwonbeomjun/Documents/rn/rn-baro_review-v1/server/src/persistence/SubjectExecutor.ts:435:42) at SubjectExecutor.execute (/Users/kwonbeomjun/Documents/rn/rn-baro_review-v1/server/src/persistence/SubjectExecutor.ts:137:9) at EntityPersistExecutor.execute (/Users/kwonbeomjun/Documents/rn/rn-baro_review-v1/server/src/persistence/EntityPersistExecutor.ts:182:21) at AuthService.signup (/Users/kwonbeomjun/Documents/rn/rn-baro_review-v1/server/src/auth/auth.service.ts:43:7) at /Users/kwonbeomjun/Documents/rn/rn-baro_review-v1/server/node_modules/@nestjs/core/router/router-execution-context.js:46:28 at /Users/kwonbeomjun/Documents/rn/rn-baro_review-v1/server/node_modules/@nestjs/core/router/router-proxy.js:9:17 { length: 234, severity: 'ERROR', code: '23505', detail: 'Key (email)=(test@test.com) already exists.', hint: undefined, position: undefined, internalPosition: undefined, internalQuery: undefined, where: undefined, schema: 'public', table: 'user', column: undefined, dataType: undefined, constraint: 'UQ_e12875dfb3b1d92d7d7c5377e22', file: 'nbtinsert.c', line: '670', routine: '_bt_check_unique' }, length: 234, severity: 'ERROR', code: '23505', detail: 'Key (email)=(test@test.com) already exists.', hint: undefined, position: undefined, internalPosition: undefined, internalQuery: undefined, where: undefined, schema: 'public', table: 'user', column: undefined, dataType: undefined, constraint: 'UQ_e12875dfb3b1d92d7d7c5377e22', file: 'nbtinsert.c', line: '670', routine: '_bt_check_unique' }
-
해결됨맛집 지도앱 만들기 (React Native + NestJS)
staleTime과 invalidateQueries
안녕하세요 선생님!우선 좋은 강의 감사합니다. 다름이 아니라 앱 강의를 보고 공부를 하던 중에 react-query에 대해 궁금한 점이 있어서 질문드립니다. 게시글을 작성할 때 invalidateQuries를 이용해서 특정 달에 작성한 게시물 리스트를 조회해오는 캐시 데이터를 무효화 시켰습니다. 강의를 들을 때는 "아! 그렇구나~" 하고 지나갔던 부분인데staleTime의 기본 값이 0이라는 사실을 알고 의문이 생겼습니다. reactQuery에서 staleTime을 지정하지 않으면 기본값 0이 적용되며 이는 데이터를 들고오자 마자 해당 데이터가 stale 상태로 변경된다는 것을 의미한다고 합니다. 그래서 무효화 쿼리가 없어도, staleTime의 값이 0이기 때문에, 캘린더 화면에 들어갔을 때는 새로 저장한 게시물에 대한 정보가 보여야 할 것으로 생각되는데, 생각과 다르게 invalidateQuery를 사용해야 하는 이유에 대해서 알 수 있을까요? 감사합니다!
-
해결됨맛집 지도앱 만들기 (React Native + NestJS)
draw적용 후 텍스트 문제 발생
맥으로 진행하고 있습니다.draw 수업을 진행하면서 에러가 나서 수업내용대로 바벨안에 플러그인 넣고 캐시 삭제 후 재실행했는데 이런 문제가 발생하네요. <Text>문제가 왜 갑자기 생겼는지 모르겠습니다.
-
해결됨맛집 지도앱 만들기 (React Native + NestJS)
[1-5] ruby 버전 문제
export PATH=$HOME/.rbenv/shims:$PATH eval "$(rbenv init - zsh)"M1 맥북을 사용 중인데, zshrc 파일에 Ruby 버전을 변경하는 코드를 추가했지만 정상적으로 작동하지 않아 인텔 맥에서 사용하는 환경 변수 코드를 사용하니 버전이 변경되었습니다.그러나 버전이 변경되었다고 해도 프로젝트를 생성할 때 환경 설정 문제가 발생합니다.
-
해결됨[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core
findOne 사용 이유
강의 8:23에 createChat 함수의 리턴값으로 save 함수에서 반환된 chat을 사용하지 않고 findOne 함수를 통해 조회한 chat을 사용하신 이유가 궁금합니다!
-
해결됨Slack 클론 코딩[백엔드 with NestJS + TypeORM]
socket io 미 연결 문제 (nest & flutter)
안녕하세요! socket관련한 서비스를 진행해보고 싶어서 제로초님의 강의를 들은 수강생입니다.현재 nest & flutter를 이용하고 있는데, flutter에서의 연결 및 다른 tool에서 socket io 연결이 되지 않으며 “외부 사이트로는 접근이 불가능한 오류”가 생겨서 조심스럽게 여쭤봅니다. 현재 로직은 채팅을 생성시, 채팅을 보여주는 리스트가 실시간으로 새로고침이 되는 부분을 작업중입니다.하지만, postman, httpie, hoppscotch의 부분에서 연결이 되지 않는 문제가 발생합니다.많은 방법을 찾아봤지만, 터미널에서 socket io cli를 통해서 로그는 볼 수 있지만, 다른 tool에서는 이용이 불가능한 방법에 대해서 알고 싶어서 질문드립니다!Socket io를 통해서 local, dev서버 연결 완료 하지만 postman의 socket io기능을 통해서 테스트를 진행하려고 할 때,postman으로 연결local에서는 문제가 없이 연길이 되지만, dev서버에서는 이러한 에러가 발생합니다. 또한 flutter 앱에서 연결을 하려면 다음과 같은 에러가 발생합니다.오류 메시지 "WebSocketException: Connection to 'http://~~~~.com:81/socket.io/?EIO=4&transport=websocket#' was not upgraded to websocket"는 클라이언트가 WebSocket 연결을 시도하였으나, 서버가 해당 연결을 WebSocket 프로토콜로 업그레이드하지 않았다는 것을 의미합니다. 이는 여러 가지 원인에 의해 발생할 수 있습니다: upgrade가 되지 않았다고 나와서 ,ngnix의 socket 부분에서 upgrade부분도 잘 넣어줬는데, 오류가 해결되지 않아서... 고민 끝에 질문 올립니다.Ngnix 설정부터 2주정도 시간을 들였지만, 해결이 되지 않아서…여쭤봅니다.방화벽도 해제가 되어 있는데 연결이 안되고 있습니다..다음은 nest에서 작성한 코드 입니다![chat.gateway.ts]import { WebSocketGateway, WebSocketServer, SubscribeMessage, OnGatewayConnection, OnGatewayDisconnect, OnGatewayInit, ConnectedSocket, MessageBody, } from '@nestjs/websockets'; import { Server, Socket } from 'socket.io'; @WebSocketGateway() export class ChatGateway implements OnGatewayInit, OnGatewayConnection, OnGatewayDisconnect { @WebSocketServer() server: Server; afterInit(server: Server) { console.log('WebSocket initialized'); } handleConnection(client: Socket) { console.log(`Client connected: ${client.id}`); // 수정: client 객체 직접 출력 대신 id 출력 } handleDisconnect(client: Socket) { console.log(`Client disconnected: ${client.id}`); } @SubscribeMessage('sendMessage') handleMessage( @ConnectedSocket() client: Socket, @MessageBody() data: { message: string } ): void { console.log(`Received message from ${client.id}: ${data.message}`); this.server.emit('newMessage', data); // 모든 클라이언트에게 메시지 전송 console.log(`Received message: ${data.message}`); } } [main.ts]import { ConfigService } from '@nestjs/config'; import { NestFactory } from '@nestjs/core'; import { NestExpressApplication } from '@nestjs/platform-express'; import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; import { join } from 'path'; import { AppModule } from './app.module'; import { HttpExceptionFilter } from './common/exceptions/http-exception.filter'; import { SuccessInterceptor } from './common/interceptors/success.interceptor'; import { IoAdapter } from '@nestjs/platform-socket.io'; import { CustomIoAdapter } from './adapters/custom-io.adapter'; async function bootstrap() { const app = await NestFactory.create<NestExpressApplication>(AppModule); app.useWebSocketAdapter(new CustomIoAdapter(app)); const configService = app.get(ConfigService); const port = configService.get('server.port'); const mongoUrl = configService.get('DB.MONGO_URL'); console.log('MongoDB URL:', mongoUrl); app.enableCors({ origin: true, credentials: true, }); app.useStaticAssets(join(__dirname, '..', 'client'), { prefix: '/api/v1/client', }); app.useGlobalInterceptors(new SuccessInterceptor()); app.useGlobalFilters(new HttpExceptionFilter()); app.setGlobalPrefix('api/v1'); const swagger_options = new DocumentBuilder() .setTitle('Nyam-Docs') .setDescription('API description') .setVersion('2.0.1') .addApiKey( { type: 'apiKey', name: 'x-token', in: 'header', description: 'Enter token', }, 'x-token', ) .addApiKey( { type: 'apiKey', name: 'x-type', in: 'header', description: 'Enter type', }, 'x-type', ) .build(); const document = SwaggerModule.createDocument(app, swagger_options); SwaggerModule.setup('api-docs', app, document); await app.listen(port, '0.0.0.0'); console.log(`Application Listening on Port : ${port}`); } bootstrap();다음은 custom한 io입니다[custom.io.adpter.ts]import { IoAdapter } from '@nestjs/platform-socket.io'; import { INestApplication, Injectable } from '@nestjs/common'; import { ServerOptions } from 'socket.io'; @Injectable() export class CustomIoAdapter extends IoAdapter { constructor(app: INestApplication) { super(app); } createIOServer(port: number, options?: ServerOptions): any { const serverOptions: ServerOptions = { ...options, cors: { origin: '*', // 모든 도메인에서 접근 허용 methods: ['GET', 'POST', 'PUT', 'DELETE'], credentials: true }, transports: ['websocket', 'polling'], //pooling 없으면 연결 안 됨(socket) allowEIO3: true // Engine.IO 3.x 버전 클라이언트 허용 }; return super.createIOServer(port, serverOptions); } } 혹시 해결방법을 아시거나, 도움을 주실만한 정보가 있으시다면 알려주시면 정말 감사하겠습니다!
-
미해결[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core
섹션26 FileIntercepter적용문의
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.코드팩토리 통합 링크https://links.codefactory.aiFlutter 강의를 구매하시면 코드팩토리 디스코드 서버 플러터 프리미엄 채널에 들어오실 수 있습니다! 디스코드 서버에 들어오시고 저에게 메세지로 강의를 구매하신 이메일을 보내주시면 프리미엄 채널에 등록해드려요! 프리미엄 채널에 들어오시면 모든 질의응답 최우선으로 답변해드립니다!
-
미해결[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core
섹션26 FileIntercepter적용 질의
분명 postman으로 FormData로 설정하신후title,content,image를 보내셨는데 어떻게Nestjs에서 @Body()로 받을수 있나요 Http요청이니 req.body 형식으로 접근 가능한게 아닐까요??