0

In my Nuxt 3 app, I use Redis to count page views. All works well, except that I get unhandled errors when Redis is not running. So, here's the question - how to handle connection errors with useStorage() and Redis?

I have read Nuxt 3 and Nitro docs, found nothing relevant...

Here's my code:

// server/api/viewCount.get.ts
export default defineEventHandler(async (event) => {
  const query = getQuery(event);
  const pageId: string = query.pageId as string;
  const redisKey: string = `viewCount:${pageId}`;
  let viewCount = 1;

  const redis = useStorage("redis");

  const data = await redis.getItem(redisKey);

  if (data) viewCount = Number(data.toString()) + 1;

  await redis.setItem(redisKey, viewCount);

  return viewCount;
});

// api.ts
export async function useViewCount(pageId: string) {
  const { data: viewCount } = await useFetch(`/api/viewCount?pageId=${pageId}`);
  return viewCount;
}

When Redis is down, I get these errors:

[ioredis] Unhandled error event: Error: getaddrinfo ENOTFOUND redis                                                                                          8:34:56 AM
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (node:dns:107:26) (repeated 14 times)
[ioredis] Unhandled error event: Error: getaddrinfo ENOTFOUND redis                                                                                          8:35:06 AM
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (node:dns:107:26)
[nuxt] [request error] [unhandled] [500] Reached the max retries per request limit (which is 20). Refer to "maxRetriesPerRequest" option for details.        8:35:06 AM
  at Socket.<anonymous> (./node_modules/ioredis/built/redis/event_handler.js:182:37)
  at Object.onceWrapper (node:events:628:26)
  at Socket.emit (node:events:513:28)
  at TCP.<anonymous> (node:net:322:12)
Hazadus
  • 78
  • 8

1 Answers1

0

I solved this problem:

1.redis save data:

/*
 * @FilePath: \first-nuxt\server\api\test\post.ts
 */
export default defineEventHandler(async (event) => {
  const body = await readBody(event)
  const redis = useStorage("redis");

  redis.setItem('redis:test', body)
  console.log("save success======")
  return 'Data is set'
})
2.redis get data:
/*
 * @FilePath: \first-nuxt\server\api\test\get.ts
 */
export default defineEventHandler(async (event) => {
  const redis = useStorage("redis");
  const data = redis.getItem('redis:test')
  return data
})

3.pages button test:

<script lang="ts" setup>

const onTestSave = async () => {
  const { data } = await $fetch('/api/test/post', { text: 'Nuxt is Awesome!' })
  console.log(data);
}

const onTestGet = async () => {
  const { data } = await $fetch('/api/test/get')
  console.log(data);
}

</script>
ifredom
  • 979
  • 9
  • 6