강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

ljy014님의 프로필 이미지
ljy014

작성한 질문수

아바타 커뮤니티앱 만들기 (React Native Expo)

server 쪽에서 should be a number of seconds or string representing a timespan 에러가 발생합니다

해결된 질문

작성

·

110

0

Window, node 22 버전 사용중입니다. 4-5 로그인 연동하기에서 회원가입까진 연동이 되는데 로그인 api 요청시 500에러가 발생합니다.

 

[Nest] 22548  - 2025. 02. 15. 오후 10:00:50   ERROR [ExceptionsHandler] "expiresIn" should be a number of seconds or string representing a timespan
Error: "expiresIn" should be a number of seconds or string representing a timespan
    at D:\project\community\server\node_modules\jsonwebtoken\sign.js:56:15
    at Array.forEach (<anonymous>)
    at validate (D:\project\community\server\node_modules\jsonwebtoken\sign.js:47:6)
    at validateOptions (D:\project\community\server\node_modules\jsonwebtoken\sign.js:62:10)
    at module.exports [as sign] (D:\project\community\server\node_modules\jsonwebtoken\sign.js:171:5)
    at D:\project\community\server\node_modules\@nestjs\jwt\dist\jwt.service.js:56:17
[Nest] 22548  - 2025. 02. 15. 오후 10:00:50     LOG [HTTP] [POST] /auth/signin (500) (okhttp/4.12.0)

 

//axios.ts
import axios from "axios";
import {Platform} from "react-native";

const baseUrls = {
    ios: 'http://localhost:3030',
    android: 'http://10.0.2.2:3030'
}

const axiosInstance = axios.create({
    baseURL: baseUrls[Platform.OS] ?? 'http://localhost:3030'
});

export default axiosInstance


//auth.ts
import {getSecureStore} from "@/utils/secureStore";
import axios from "@/api/axios";
import {Profile} from "@/types";

interface RequestUser {
    email: string;
    password: string
}

async function postSignup(body: RequestUser): Promise<void> {
    const {data} = await axios.post('/auth/signup', body);
    return data;
}


async function postLogin(body: RequestUser): Promise<{ accessToken: string }> {
    const {data} = await axios.post('/auth/signin', body);
    return data;
}


//useAuth.ts
function useLogin() {
    return useMutation({
        mutationFn: postLogin,
        onSuccess: async ({accessToken}) => {
            setHeader('Authorization', accessToken)
            await saveSecureStore('accessToken', accessToken);
            queryClient.fetchQuery({queryKey: ['auth', 'getMe']});
            router.replace('/')
        },
        onError: () => {
        },
    })
}

postLogin 에서 엔드포인트만 /auth/signup로 바꾸면 회원가입은 정상적으로 요청이 됩니다.

답변 2

0

Kyo님의 프로필 이미지
Kyo
지식공유자

env를 생성할때 README 를 그대로 복사하셨다면,

env 파일에서 맨아랫줄 키를 JWT_ACCESS_TOKEN_EXPIRATION 으로 변경하고 해보시겠어요?? 오타(ACCERSS)가있었네요! 수업 파일 README도 변경해놓았습니다.

ljy014님의 프로필 이미지
ljy014
질문자

말씀해주신대로하니 해결됐습니다! 감사합니다!

0

안녕하세요, 인프런 AI 인턴입니다. ljy014님이 겪고 계신 문제를 해결하기 위한 조언을 드리겠습니다.

현재 발생하고 있는 "expiresIn" should be a number of seconds or string representing a timespan 오류는 jsonwebtoken 라이브러리를 사용하여 JWT 토큰을 생성할 때 expiresIn 옵션 값이 잘못되었기 때문에 발생하는 문제입니다. 보통 이 옵션은 토큰의 만료 시간을 설정하며, 숫자(초 단위)나 문자열 형식(“1h”, “7d” 등)으로 설정해야 합니다. 이 문제를 해결하기 위해 sign 함수가 호출되는 부분을 점검해 주세요.

문제 해결 방법:

  1. 서버 부분 확인:
    jsonwebtoken.sign 함수가 호출되는 코드에서 expiresIn 옵션이 올바르게 설정되어 있는지 확인해 보세요. 예를 들어, 아래와 같이 설정할 수 있습니다:
   const token = jwt.sign({ userId }, secret, {
     expiresIn: '1h', // 1 hour
   });
  1. 설정값 검사:
    .env 파일이나 설정 파일에서 expiresIn 값을 잘못 설정했을 가능성도 있습니다. 해당 파일들을 확인하고 만약 설정이 없는 경우 이 값을 명시적으로 지정해 주세요.

  2. NestJS 설정:
    NestJS JWT 모듈의 설정 부분에서 expiresIn 값이 올바르게 설정되어 있는지 확인하세요.

  3. 타 서비스 참조:
    혹시 다른 서비스나 모듈에서 token 관련 설정 값을 가져오고 있다면, 그 값들이 적절한지도 체크해보시기 바랍니다.

유사한 문제를 겪었던 사용자들의 질문과 답변에서 더 많은 실마리를 얻으실 수 있습니다. 아래는 관련 링크입니다.
- JWT 오류 해결 - jsonwebtoken 사용 시 주의할 점

문제가 지속되거나 추가적인 오류가 발생한다면 더 자세한 정보를 제공해 주시면 더 나은 조언을 드릴 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

ljy014님의 프로필 이미지
ljy014

작성한 질문수

질문하기