공부/Nest

ReferenceError: crypto is not defined

조용한외침 2025. 5. 24. 16:37

Scheduler가 필요하여 공식문서에 제공하는 라이브러리를 설치한 후 서버를 실행하니 처음 보는 에러를 겪었습니다.

공식 문서에서 제공하는 라이브러리를 설치했는데 설치만으로 문제가 생긴다면 어떤 부분이 문제인지 원인 파악이 필요했습니다.

원인 파악 후 해결방법을 작성한 글입니다.

혹시 node version이 18 이하 분께서 해당 에러를 겪는다면 저와 동일하실 것이라고 생각합니다. 하지만 version이 20이상이시 라면 도움이 안 되실 수도 있다는 점 먼저 알려드립니다.


 

Error Message

This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with. catch(). The promise rejected with the reason: ReferenceError: crypto is not defined

 

nestjs 서버는 기본적으로 nodejs 런타임에서 실행되므로 crypto가 정의돼 있어야 합니다. crypto 모듈은 nodejs의 내장 모듈 중 하나로, 암호화 관련 기능을 제공합니다. 

 

위 에러는 Nestjs에서 crypto 모듈을 사용해야 하는데 import 하지 않아서 발생한 에러라고 생각하였습니다.

제가 import를 하고 있는곳이 있나를 생각했을 때 그런 곳은 존재하지 않았습니다. 

 

다만, 다른 라이브러리에서 crypto.randomUUID() or crypto로 랜덤 바이트를 생성하면서 발생을 할 수도 있다고 합니다.

 

동일한 에러가 발생했을 대 해결할 수 있는 방법이 여러 가지 있겠지만 제가 확인해 본 결과는 총 2가지였습니다.

1번은 임시방편입니다. 저는 2번으로 해결하였습니다.

1. 임시방편으로 main.ts 파일에 crypto를 import 해줍니다.

// main.ts 
import { randomUUID } from 'crypto';

(global as any).crypto = {
  randomUUID: () => randomUUID(),
};

 

2. node version을 변경합니다.

우선 현재 node --version을 확인해야합니다. 저의 경우 18이었기 때문에 해당 문제가 발생하였습니다.

현재 LTS는 22버전이지만 20까지 maintenance입니다.

// 버전 올리는 방법
nvm list -- 설치된 버전 확인
nvm install 20 -- 원하는 버전을 작성
nvm use 20 -- 버전을 사용한다고 지정
nvm alias default 20.19.0 -- 설치 버전 지정

alias는 필수는 아닙니다. 다만 인스턴스 or local에서 터미널을 종료했을 경우 접속마다 node version이 기존 default로 변경되는 상황이 생깁니다.

 

만약 PM2로 실행중이라면 pm2를 save도 하고 update도 해주는 것을 추천합니다.

pm2를 save하지 않으시고 update를 실행하시면 기존에 실행하던 서버들이 모두 종료 및 삭제됩니다.

node version이 변경된 상황이기 때문에 바뀐 환경에서도 pm2를 설치해주셔야 합니다.

 

다만 version이 바뀌었기 때문에 실제로 pm2에서 실행 중인 서버를 삭제했다가 다시 실행해야 변경된 환경에 적용됩니다.


이슈를 통해서 느낀점은 전 세계에는 나와 동일한 에러를 겪는 사람이 항상 존재할 것이며, 어떤 문제를 어떻게 처리하였는지 잘 기록하고 공유하는 것이 개발자가 가져야 할 덕목이라고 생각합니다. 저도 제가 작성한 글이 누군가에게 도움이 됐으면 합니다.

 

 

특정 문제나 궁금한 점을 검색하며 찾아보고 작성한 글입니다. 혹시라도 부정확한 정보를 전달드릴 수 있습니다. 틀린 부분이 있으면 댓글을 남겨주세요.

 

Ref.

https://github.com/typeorm/typeorm/issues/11270

https://nodejs.org/en/about/previous-releases

 

Node.js — Node.js Releases

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

nodejs.org

https://docs.nestjs.com/techniques/task-scheduling

 

Documentation | NestJS - A progressive Node.js framework

Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Programming), FP (Functional Programming), and FRP (Functional Rea

docs.nestjs.com