javascript 为NextJS API路由使用Redis单例

7eumitmz  于 2023-01-24  发布在  Java
关注(0)|答案(1)|浏览(264)

在我的NextJS应用中,我有多个API路径:

  • /API/用户/[ID]
  • /API/问题
  • /API/帖子

每个端点都使用Redis连接到Redis服务器中的getput数据。
我注意到我的控制台出现了错误,因为我与Redis服务器建立了太多的连接,所以我想创建一个Singleton类,在这个类中连接一次Redis服务器。getInstance()返回连接。
但是我注意到我的单例是每个API路径创建一次的,NextJS做了什么导致了这种情况发生吗?
如何在NextJS应用中创建一个Redis连接示例,仅用于pages/api中的API路由?我使用的是ioredis库。

dtcbnfnu

dtcbnfnu1#

你可以使用全局变量。下面的redis设置应该适用于nextJS,使用redis云免费示例,在免费计划中最多有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;

相关问题