데이터 공부/데이터베이스 & SQL

Redis - Node.js 연동 - ClientClosedError: The client is closed

한소희DE 2022. 3. 23. 01:06

 

 

나는 업무 상 redis 를 node js 애플리케이션에 연동해서 수행해야 할 테스트 작업이 있었다.

사실 js 를 잘 다루지 못하지만, 해당 방법에 대해서는 구글링 시 많은 자료가 나오므로 비교적 손쉽게 연동을 할 수가 있었다.

 

 

 

내가 처음에 참고한 블로그는 아래와 같다.

 

https://zzdd1558.tistory.com/232 

 

[Node.js] Node + Redis 연동 후 테스트

Node.js 서버와 Redis를 연동하여 나중에 공부해볼 Redis Session관리를 하기전에 Node 서버와 Redis가 연동이 되어야 하기 때문에 Node와 Redis연동하는 방법을 알아보도록 하겠습니다 . 먼저 Node.js에서 redis

zzdd1558.tistory.com

 

 

 

 

 

 

하지만 해당 내용을 참고하며 진행할 때, 아래와 같은 에러를 마주했다.

ClientClosedError: The client is closed

 

 

 

 

구글링 결과, 해당 에러를 야기하는 주요 원인 중 하나는, connect 가 진행되기 이전에 redis 명령어가 실행되어 그렇기 때문이라고 하였고, 따라서 await 설정을 하여 redis 명령을 주어야 정상적으로 실행된다는 것을 알았다.

 

 

 

하지만 await 설정을 하기 위해서는 async function 내부에 위치해야 가능하므로, 하나의 func. 를 생성하여 redis 명령어에 await 설정을 해주었다.

 

 

나는 redis 명령어 중 get 명령어를 이용해 테스트하기로 했다. 따라서 이를 정상적으로 작동시키기 위해서는, 127.0.0.1:6379 redis 에 접속하여 키 값을 저장하는 선수 작업이 필요하다. 따라서 콘솔에 입력할 명령어는 아래와 같다.

(만약 not connected 가 뜬다면, 로컬의 redis-server 가 실행되고 있는지 확인해주어야 한다.)

redis-cli -h 127.0.0.1 -p 6379

127.0.0.1:6379> set test-key test-value
OK
127.0.0.1:6379> get test-key
"test-value"

 

 

 

 

이후 아래 수정된 js 파일을 실행하여, get test-key 명령어와 똑같은 아웃풋을 산출하는지 확인해보아야 한다.

 

// index.js

const redis = require('redis');
const client = redis.createClient({
      port: 6379,
      host: '127.0.0.1' });

async function run() {

  await client.connect();

  const value = await client.get("test-key");
  console.log(value);

  await client.disconnect();
};

run();

 

해당 코드를 설명하자면, 기존에 미리 설정해둔 test-key 라는 key의 value를 산출하는 코드다.

나는 앞서 set 명령으로 test-key에 대한 value 를 test-value 로 저장해놓았으므로, 해당 코드를 실행했을 시 이와 같은 아웃풋이 산출되어야 할 것이다.

 

 

 

실행 결과는 아래와 같다.

 

hansohee@MacBookPro dev % node index.js
test-value

 

 

이로써 해당 에러를 해결했다!

 

이때 주의할 점은, 해당 js 파일은 로컬 redis-server에 대해서만 커넥팅된다는 것이다.

해당 js 파일에서 아무리 host, port 파라미터 값을 변경해도 로컬 redis-server 에 커넥팅되는 현상이 발생한다.

 

이 또한 구글링을 해서 다른 host 로도 node js 와 연결하는 방법을 찾아 해당 문제를 해결했는데, 이는 다음 포스팅에서 다뤄보도록 하겠다.