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

Express Handlebars渲染home.handlebars失败 提示找不到main.handlebars

问题根因

Express 与 express-handlebars 默认以执行node启动命令时的终端工作目录为基准拼接视图文件路径,不会自动将app.js所在目录作为路径解析基准。只要启动服务时的工作目录和app.js存放目录不一致,就会出现路径拼接错位,导致模板引擎找不到目标layout文件。
触发错误时的提示如下:

Error: ENOENT: no such file or directory, open 'C:\Users\Admin\Documents\code\views\layouts\main.handlebars'

从报错信息可以确认,当前引擎查找视图的基准路径为C:\Users\Admin\Documents\code\,和实际存放views目录的路径不匹配,因此触发ENOENT文件不存在错误。
少数情况下该错误也会由Windows系统默认隐藏已知文件扩展名导致:创建main.handlebars文件时,系统会自动追加.txt后缀,实际文件名变为main.handlebars.txt,和引擎查找的文件名不匹配。

修复方案

优先选择第一种修复方式,一次配置后不会因为启动目录变化复现问题:

  • 引入Node原生path模块,显式为Express配置views目录的绝对路径,从根源上避免相对路径解析偏差。核心代码修改如下:
const express = require('express')
const path = require('path')
const { engine } = require("express-handlebars")
const app = express();

// 固定指定views目录为app.js同级的views文件夹,不受启动时工作目录影响
app.set('views', path.join(__dirname, 'views'))
app.engine("handlebars", engine({
  defaultLayout: 'main' // 对应layouts目录下的main.handlebars,和标准目录结构完全匹配
}));
app.set("view engine","handlebars")

app.get("/",(req,res)=>{
  res.render("home");
})

app.listen(8080)
  • 临时方案:启动服务前先通过cd命令切换终端工作目录到app.js所在的文件夹,再执行node app.js启动。该方案依赖启动操作,后续如果从其他目录执行启动命令会再次触发报错,不推荐长期使用。

额外排查项:打开Windows系统的文件扩展名显示开关,确认home.handlebars、main.handlebars的后缀名正确,没有被系统自动追加.txt等隐藏后缀。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 20:27:28