React+Stream聊天应用登录时ERR_CONNECTION_REFUSED错误排查
React + Stream 聊天应用登录ERR_CONNECTION_REFUSED问题排查与代码修复
核心问题分析
- 注册流程未持久化用户数据:原代码仅生成了用户token和密码哈希,但从未将用户信息写入Stream聊天系统,也未存储到本地数据库,导致登录时无法查询到用户,触发后续异常。
- Stream客户端初始化错误:登录时
StreamChat.getInstance的调用方式不符合服务器端使用规范,且依赖Stream查询用户的逻辑不合理(Stream不建议存储密码哈希这类敏感信息)。 - 错误处理缺失连接相关判断:未针对
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
相关产品推荐
相关产品推荐

