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

Express路由登录功能报错:启用POST路由时出现cannot get skill错误

问题原因解析与Express路由核心原则

一、错误原因

启用登录POST路由时触发“cannot get skill”错误,核心问题是模板渲染的数据缺失:

登录POST路由启用后的代码:

app.post("/home/login", async(req, res)=>{
    let {userName, email, password} = req.body;
    let user = await User.findOne({email: email, password: password})
    res.render("index.ejs", {user});
})

而index.ejs中依赖skills变量进行遍历渲染:

<% for( let skill of skills) { %>
    <div>
        <img src="<%= skill.image %>" alt="">
        <p><%= skill.title %></p>
    </div>
<% } %>

登录提交后,路由仅向index.ejs传入了user变量,未传入模板必需的skills(以及allCards),导致模板遍历undefined的skills时抛出“无法读取skill”类错误。

注释该路由后,登录表单提交时找不到对应POST路由,不会执行res.render("index.ejs")的逻辑,因此不会触发模板渲染错误。

二、Express路由核心原则

  • 请求方法严格匹配:GET、POST、PUT等HTTP方法独立匹配,POST请求只会匹配同路径的POST路由,不会触发GET路由逻辑。
  • 路由定义顺序影响匹配:Express按路由定义的先后顺序匹配请求,需避免模糊路由(如app.get("/*", ...))覆盖具体路由。
  • 响应数据完整性:渲染模板时必须传入所有模板依赖的变量,否则会导致模板引擎抛出渲染错误;每个路由处理函数必须调用res.send/res.render/res.redirect等方法发送响应,避免客户端等待超时。
  • 异步错误处理:异步路由中需用try/catch捕获错误,或使用全局错误中间件,防止未处理的Promise异常导致程序崩溃。

三、修复方案

修改登录POST路由,确保渲染index.ejs时传入所有模板所需数据,并修正不必要的变量解构(登录表单无userName字段):

app.post("/home/login", async(req, res)=>{
    try {
        let {email, password} = req.body;
        let user = await User.findOne({email: email, password: password});
        // 获取首页模板所需的全部数据
        let allCards = await Card.find({});
        let skills = await Skill.find({});
        // 传入所有模板依赖的变量
        res.render("index.ejs", {user, allCards, skills});
    } catch (err) {
        console.error(err);
        res.status(500).send("登录失败,请稍后重试");
    }
})

额外提醒:

  • 禁止明文存储密码,需使用bcrypt等加密库对密码进行哈希处理后再存入数据库。
  • 登录逻辑需增加用户不存在、密码不匹配的分支处理,给用户明确的反馈。

内容的提问来源于stack exchange,提问作者Shahab ali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 02:26:06