使用 Redis 单例模式处理 NextJS API 路由。

6

我的NextJS应用程序中有多个API路由:

  • /api/user/[id]
  • /api/questions
  • /api/posts

每个端点使用Redis连接在Redis服务器中获取放置数据。

我注意到控制台会出现错误,因为我向Redis服务器建立了太多的连接。所以我想创建一个Singleton类,并在其中一次连接到Redis服务器。 getInstance() 返回该连接。

但是我发现我的单例模式对于每个API路由都被创建了一次。 NextJS是否做了某些事情导致这种情况发生?

如何在NextJS应用程序中创建1个Redis连接实例,只针对存储在pages/api中的API路由? 我正在使用ioredis库。


有什么解决方案吗? - Saby
1个回答

0

您可以使用全局变量。以下 Redis 的设置应该适用于使用 Redis 云免费实例的 NextJS,该实例在免费计划中最多只有 30 个连接。

代码:

import * as redis from 'redis';

const REDIS_USERNAME = process.env.REDIS_USERNAME;
const REDIS_PASSWORD = process.env.REDIS_PASSWORD;
const REDIS_HOST = process.env.REDIS_HOST;
const REDIS_PORT = process.env.REDIS_PORT;

let redisClient;
let redisClientPromise;

if (process.env.NEXT_PUBLIC_NODE_ENV === 'development') {
    if (!global._redisClientPromise) {
        redisClient = redis.createClient({
            url: `redis://${REDIS_USERNAME}:${REDIS_PASSWORD}@${REDIS_HOST}:${REDIS_PORT}`
        });
        redisClient.connect().then(() => {
            console.info(
                `NextJS Redis client connected..`
            );
        }).catch((error) => {
            console.error(`[ERROR] Couldn't connect to Redis client: ${error}`);
        });
        global._redisClientPromise = redisClient;
    }
    redisClientPromise = global._redisClientPromise
} else {
    redisClient = redis.createClient({
        url: `redis://${REDIS_USERNAME}:${REDIS_PASSWORD}@${REDIS_HOST}:${REDIS_PORT}`
    });
    redisClient.connect().then(() => {
        console.info(
            `NextJS Redis client connected..`
        );
    }).catch((error) => {
        console.error(`[ERROR] Couldn't connect to Redis client: ${error}`);
    });
    redisClientPromise = redisClient;
}

export default redisClientPromise;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接