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

Node.js应用中EJS页面无法渲染的原因及解决方法求助

问题原因与解决方案

核心原因:app.use的路由匹配规则踩坑了

你现在用的app.use("/", ...)是前缀匹配的中间件——也就是说,任何以/开头的请求(所有HTTP请求都是)都会被这个中间件捕获并处理,而且Express的中间件是按代码顺序执行的。所以当你请求/about时,第一个命中的是根路径的app.use,它直接渲染了index.ejs,完全不会走到后面的app.use("/about", ...)。

至于直接输入/about显示index.js的情况,大概率是你同时配置了静态文件托管(比如express.static(__dirname)),当根路径中间件存在时,所有请求都被它拦截处理;如果中间件逻辑没覆盖到对应场景,服务器就会 fallback 到静态文件返回index.js。

解决步骤:

  1. 把路由处理从app.use改成app.get
    app.get是针对GET请求的精确路径匹配(更准确地说,是匹配完整路径,除非使用通配符),这样根路径的路由只会处理GET /请求,不会干扰/about的路由:

    app.get("/", (request, response) => { response.render('index') })
    app.get("/about", (request, response) => { response.render('about') })
    

    (如果需要处理POST等其他请求,对应改用app.post或者app.all,但这里导航链接是GET请求,用app.get就足够)

  2. 修正EJS里的链接路径为绝对路径
    你现在用的../about是相对路径,虽然在根路径下能正常解析,但如果后续有更深层级的页面(比如/posts/1),相对路径就会出问题。改成绝对路径更可靠:

    <a href="/about"> About </a>
    
  3. 额外检查:确保EJS视图配置正确
    虽然你没提到,但最好确认Express已经正确配置了EJS作为视图引擎:

    const path = require('path');
    app.set('view engine', 'ejs');
    // 如果views目录不在默认位置,需手动指定路径:
    app.set('views', path.join(__dirname, 'views'));
    

验证效果:

  • 访问localhost:port/,正常显示index.ejs
  • 点击About链接,URL跳转到/about,正确渲染about.ejs
  • 直接输入localhost:port/about,也能正常显示about.ejs

内容的提问来源于stack exchange,提问作者Hung Vu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:33:16