localhost站点返回/welcome页时用户名数据重置问题修复
问题描述
需要修复JS文件逻辑缺陷、更新相关代码,解决每次返回站点初始页面时程序状态重置的问题。
现有程序功能
- 站点运行在localhost环境下,程序启动后首先通过prompt弹窗提示用户输入用户名,该用户名作为用户所属聊天/频道的身份标识
- 用户可创建、加入多个频道
- 若两个客户端同时运行并加入同一聊天频道,即可实现消息即时收发、内容实时同步
- 项目仓库地址:https://github.com/NilesDobbs/Assignment14
实现目标
用户输入用户名进入聊天房间后,若手动跳转访问/welcome路径,程序需保留已录入的用户名信息,不再重复弹出用户名输入提示,直接进入站点主功能页面。
目前已知排查方向为welcome.js文件的逻辑校验环节,该文件现有代码如下:
let username = prompt('Enter your name') fetch("/welcome/createuser", { method : "POST", headers: { "Content-Type" : "application/json" }, body: username }) .then((response) => response.json()) .then(user => sessionStorage.setItem("user",JSON.stringify(user)))
问题根因
现有代码没有做本地缓存校验,welcome.js只要加载就无条件弹出输入框、发起创建用户的请求,完全没有读取之前存在sessionStorage里的用户数据,所以每次跳转回/welcome路径都会重置用户状态。
另外现有代码还存在一个请求格式错误:声明了Content-Type为application/json,但请求体直接传原始字符串,没有做JSON序列化,后端大概率无法正常解析参数。
修复方案
- 页面加载第一步优先读取
sessionStorage中已存储的用户信息,如果存在有效用户数据,直接初始化主页面功能,不再弹出输入框、不重复发起创建用户请求 - 仅当本地不存在已存用户数据时,才弹出prompt要求输入用户名,同时增加用户名非空校验
- 修正POST请求的请求体格式,将用户名序列化为标准JSON字符串再发送
- 将页面主功能(频道渲染、消息监听、加入/创建频道等逻辑)抽为独立初始化函数,无论走缓存还是新建用户流程,最终都调用该函数加载主页面
修复后的参考代码:
/** * 页面主功能初始化函数 * 所有频道加载、消息收发、交互逻辑都放到这个函数里 * @param {Object} user - 当前登录用户信息 */ function initChatApp(user) { // 原有页面加载后执行的逻辑全部移到这里,比如渲染频道列表、绑定创建/加入频道事件、建立消息实时同步连接等 console.log('当前登录用户:', user) } // 页面初始化入口 const savedUser = sessionStorage.getItem('user') if (savedUser) { // 命中本地缓存,直接初始化应用 initChatApp(JSON.parse(savedUser)) } else { // 无本地缓存,走新用户创建流程 const username = prompt('Enter your name')?.trim() if (!username) { alert('用户名不能为空,请刷新页面重试') } else { fetch("/welcome/createuser", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ username }) // 修正请求体为标准JSON格式 }) .then(response => response.json()) .then(user => { sessionStorage.setItem("user", JSON.stringify(user)) initChatApp(user) }) .catch(err => console.error('用户初始化失败:', err)) } }
补充说明:如果需要用户关闭标签页后再打开站点仍然保留登录状态,可以将代码中所有
sessionStorage替换为localStorage,前者仅在当前标签页生命周期内生效,关闭标签页自动清除,后者为本地持久化存储,除非手动清除浏览器缓存否则不会失效。
内容的提问来源于stack exchange,提问作者Niles Dobbs
相关产品推荐
相关产品推荐

