如何设置默认用户名或显示注册按钮,避免undefined错误?
解决未登录时页面渲染报错的问题
问题原因
未登录状态下req.user是undefined,直接访问req.user.username会触发TypeError: Cannot read properties of undefined (reading 'username');同时原路由代码的渲染参数传递方式有误——res.render的第二个参数需要是键值对对象,直接传字符串变量会导致模板无法正确获取user值。
方案1:给user设置默认值
修改路由逻辑,先判断用户是否登录,存在则取用户名,否则设为默认值,同时修正渲染参数的传递格式:
router.get("/", function (req, res, next) { // 判断req.user是否存在,存在则取username,否则用默认值 const userName = req.user ? req.user.username : "访客"; // 传递包含user键的对象,模板才能正确读取<%= user %> res.render("index", { user: userName }); });
模板保持不变:
Welcome, <%= user %>
未登录时页面会显示Welcome, 访客,避免报错。
方案2:根据登录状态显示不同内容(注册/登录按钮)
这种方案更贴合用户体验,未登录时显示注册、登录按钮,登录后显示欢迎语:
- 修改路由,传递登录状态和用户名:
router.get("/", function (req, res, next) { const renderData = { isLoggedIn: !!req.user, // 转为布尔值标记登录状态 userName: req.user ? req.user.username : "" }; res.render("index", renderData); });
- 模板中添加条件判断(以EJS为例):
<% if (isLoggedIn) { %> Welcome, <%= userName %> <% } else { %> <a href="/register">注册</a> | <a href="/login">登录</a> <% } %>
这样未登录时不会触发错误,还能引导用户进行注册或登录操作。
内容的提问来源于stack exchange,提问作者Dagger
相关产品推荐
相关产品推荐

