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

React+Stream聊天应用登录时ERR_CONNECTION_REFUSED错误排查

React + Stream 聊天应用登录ERR_CONNECTION_REFUSED问题排查与代码修复

核心问题分析

  1. 注册流程未持久化用户数据:原代码仅生成了用户token和密码哈希,但从未将用户信息写入Stream聊天系统,也未存储到本地数据库,导致登录时无法查询到用户,触发后续异常。
  2. Stream客户端初始化错误:登录时StreamChat.getInstance的调用方式不符合服务器端使用规范,且依赖Stream查询用户的逻辑不合理(Stream不建议存储密码哈希这类敏感信息)。
  3. 错误处理缺失连接相关判断:未针对ERR_CONNECTION_REFUSED这类网络/连接错误做针对性提示。

修改后的完整代码

const { connect } = require('getstream');
const bcrypt = require('bcrypt');
const crypto = require('crypto');

require('dotenv').config();

const api_key = process.env.STREAM_API_KEY;
const api_secret = process.env.STREAM_API_SECRET;
const app_id = process.env.STREAM_APP_ID;

// 生产环境请替换为真实数据库(如MongoDB/MySQL),此处仅为演示用内存存储
const userDatabase = new Map();

const signup = async (req, res) => {
    try {
        const { fullName, username, password, phoneNumber } = req.body;

        // 检查用户名是否已注册
        if (userDatabase.has(username)) {
            return res.status(400).json({ message: '用户名已存在' });
        }

        const userId = crypto.randomBytes(16).toString('hex');
        const hashedPassword = await bcrypt.hash(password, 10);

        // 初始化Stream服务器端客户端并写入用户信息
        const serverClient = connect(api_key, api_secret, app_id);
        await serverClient.updateUser(
            {
                id: userId,
                name: username,
                fullName: fullName,
                phoneNumber: phoneNumber
            },
            api_secret // 服务器端更新用户需传入密钥授权
        );

        // 将用户核心信息存入本地数据库
        userDatabase.set(username, {
            userId,
            fullName,
            hashedPassword,
            phoneNumber
        });

        const token = serverClient.createUserToken(userId);
        res.status(200).json({ token, fullName, username, userId, phoneNumber });
    } catch (error) {
        console.error('注册错误:', error);
        res.status(500).json({ message: '注册失败,请稍后重试' });
    }
};

const login = async (req, res) => {
    try {
        const { username, password } = req.body;
        
        // 从本地数据库获取用户信息
        const user = userDatabase.get(username);
        if (!user) {
            return res.status(400).json({ message: '用户不存在' });
        }

        // 验证密码
        const success = await bcrypt.compare(password, user.hashedPassword);
        if (!success) {
            return res.status(401).json({ message: '密码错误' });
        }

        // 生成Stream用户登录token
        const serverClient = connect(api_key, api_secret, app_id);
        const token = serverClient.createUserToken(user.userId);

        res.status(200).json({ 
            token, 
            fullName: user.fullName, 
            username, 
            userId: user.userId 
        });
    } catch (error) {
        console.error('登录错误:', error);
        // 针对连接拒绝错误做针对性提示
        if (error.message.includes('ERR_CONNECTION_REFUSED')) {
            return res.status(503).json({ message: '无法连接到Stream服务,请检查网络或API配置' });
        }
        res.status(500).json({ message: '登录失败,请稍后重试' });
    }
};

module.exports = { signup, login }

额外排查点

  • 确认.env文件中的STREAM_API_KEY、STREAM_API_SECRET、STREAM_APP_ID无拼写错误
  • 检查服务器网络是否允许访问Stream的API域名(stream-io-api.com)
  • 确保使用的Stream SDK为最新稳定版本

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 14:20:27