Node.js服务器登录后崩溃:TypeError参数类型无效问题求助
这个错误的核心原因是传给Redis客户端的参数类型不符合要求,尤其是执行set/setex这类存储命令时,传入了非字符串/Buffer类型的数据,或者参数为undefined/null。结合你的场景——登录后先返回token再崩溃,说明token生成与返回逻辑正常,崩溃出现在后续用Redis存储用户相关数据的步骤,也就是user.service.ts第46行的Redis调用代码。
具体排查与修复步骤:
检查第46行的Redis调用参数
找到user.service.ts第46行的代码,大概率是直接将JavaScript对象传给了Redis命令,比如:// 错误示例:直接传入对象,Redis无法序列化 await redisClient.set(`user:${userId}`, userInfo);Redis仅支持存储字符串或Buffer类型数据,需要先将对象序列化为JSON字符串:
// 修复:序列化对象后再存储 await redisClient.set(`user:${userId}`, JSON.stringify(userInfo));验证参数是否为
undefined/null
如果传入Redis命令的参数是undefined或null,部分客户端版本也会抛出该错误。可以在调用前添加日志排查:console.log('Redis存储参数类型:', typeof targetData, '值:', targetData); await redisClient.set(redisKey, targetData);若发现参数异常,回溯上游逻辑确认数据是否被正确赋值。
适配Redis客户端版本要求
如果你使用的是redis@4.x及以上版本,命令参数格式有变化。比如设置过期时间时,旧版本的set(key, value, expire)写法不再兼容,需要改用选项对象:// 错误写法(旧版本) await redisClient.set(`user:${userId}`, JSON.stringify(userInfo), 3600); // 正确写法(redis@4+) await redisClient.set(`user:${userId}`, JSON.stringify(userInfo), { EX: 3600 });若使用
ioredis客户端,也需确认参数格式是否符合对应版本要求。Docker环境Redis连接确认
虽然服务能返回token,但仍需确认Redis客户端是否正常连接到Docker中的Redis实例。可以添加连接状态监听:redisClient.on('connect', () => { console.log('已成功连接到Redis'); }); redisClient.on('error', (err) => { console.error('Redis连接错误:', err); });确保Redis容器正常运行,且服务端配置的Redis地址、端口、密码正确。
总结
优先排查user.service.ts第46行的Redis命令参数类型,90%以上的概率是未序列化对象或传入了无效参数导致的。
内容的提问来源于stack exchange,提问作者Neetesh Khanal

