You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SvelteKit +server.ts 连接Redis遇Socket已打开错误及无响应问题

Redis连接问题排查与解决方案

第一阶段:Socket already opened错误分析

问题根源

  1. 模块级单例复用:SvelteKit的+server.ts是模块级代码,你在顶部创建的client是全局单例。第一次请求调用await client.connect()后连接已建立,第二次请求重复调用connect()就会触发"Socket already opened"错误。
  2. 无效的错误处理:client.on("error")回调里直接返回Response完全无效,这个回调无法处理请求级错误,只会让错误被静默,导致请求无响应。
  3. 连接清理不完整:如果Redis操作抛出异常,await client.disconnect()不会执行,已打开的连接会残留,引发后续请求异常。

修复方案

改用长连接单例模式,不要在每次请求中连接/断开Redis:

  • 将Redis客户端抽为独立模块,初始化时建立连接并保持长连接
  • 端点代码直接使用已连接的客户端,移除请求内的connect()和disconnect()调用

第二阶段:重构后无日志、无响应问题分析

问题根源

  1. 模块初始化阻塞:redis.ts中的顶层await redisDB.connect()会阻塞SvelteKit服务器模块加载,导致端点无法正常处理请求,自然无日志输出。
  2. 未捕获异常:Redis操作、SendGrid邮件发送可能抛出错误,但端点的POST函数没有try/catch,异常会被静默,导致请求挂起无响应。
  3. 客户端请求潜在问题:FormData处理后发送JSON时,可能存在格式错误或请求未正确发送,但未做错误捕获。

修复方案

1. 修复Redis模块初始化

把顶层await改成异步IIFE,避免阻塞模块加载:

// $server/redis.ts
import { REDIS_CONNECTION } from '$env/static/private';
import { createClient } from 'redis';

export const redisDB = createClient({
    url: REDIS_CONNECTION,
});

// 日志事件处理
redisDB.on("connect", () => console.error("Connected to Redis!"));
redisDB.on("ready", () => console.error("Redis is ready!"));
redisDB.on("reconnecting", () => console.error("Redis is reconnecting!"));
redisDB.on("end", () => console.error("Redis connection has ended!"));
redisDB.on("error", (err) => console.error("Redis error:", err));

// 异步初始化连接,不阻塞模块加载
(async () => {
    try {
        await redisDB.connect();
    } catch (err) {
        console.error("Failed to connect to Redis:", err);
    }
})();

2. 端点添加全局错误捕获

确保所有异常都被捕获并返回响应:

// +server.ts
export const POST = (async ({ request }) => {
    try {
        const user = await request.json();
        const email = user?.email?.trim();

        console.log('email', email);

        if (!email || !emailRegex.test(email)) {
            return new Response(JSON.stringify({ 
                success: false, 
                response: '请输入有效的邮箱地址' 
            }), { status: 400 });
        }

        const value = await redisDB.get(email);
        console.log('value', value);

        if (value === null) {
            await redisDB.set(email, String(true));
            const response = await sendEmail(email);
            const success = [200, 201, 202].includes(response[0]?.statusCode);

            return new Response(JSON.stringify({ 
                success, 
                response: '订阅成功', 
                objres: response 
            }));
        } else {
            return new Response(JSON.stringify({ 
                success: false, 
                response: '该邮箱已订阅' 
            }));
        }
    } catch (err) {
        console.error("请求处理错误:", err);
        return new Response(JSON.stringify({ 
            success: false, 
            response: '服务器内部错误',
            message: (err as Error).message 
        }), { status: 500 });
    }
}) satisfies RequestHandler;

3. 客户端请求添加错误捕获

调试请求是否正常发送:

// +page.svelte
async function mailListAction(event: Event, endpoint: string) {
    const form = event.target as HTMLFormElement;
    const data = new FormData(form);
    const email = data.get('email')?.toString().trim();

    if (!email) {
        toast.error('Bitte gib eine gültige E-Mail Adresse ein!');
        return;
    }

    try {
        const response = await fetch(`/${endpoint}`, {
            method: 'POST',
            body: JSON.stringify({ email }),
            headers: {
                'Accept': 'application/json',
                'Content-Type': 'application/json'
            }
        });

        if (!response.ok) {
            throw new Error(`HTTP错误! 状态码: ${response.status}`);
        }

        const res = await response.json();
        console.log('res', res);

        res.success ? toast.success(res.response) : toast.error(res.response);
    } catch (err) {
        console.error('请求错误:', err);
        toast.error('请求失败,请稍后重试');
    }
}

内容的提问来源于stack exchange,提问作者ihaveaquestion

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 21:22:00