Amazon Linux上Express应用Handlebars.js视图模板查找失败问题
问题概况
部署采用Handlebars.js模板引擎的Express应用到EC2 Amazon Linux实例时,服务器启动正常且能连接数据库,但浏览器访问时出现错误:Failed to lookup view "homepage" in views directory "/views"。该应用在本地及Heroku平台运行正常,问题在配置nginx反向代理前就已存在,推测与systemd服务配置有关。
核心原因
Express默认会从当前工作目录下的views文件夹查找模板文件。本地和Heroku启动应用时,工作目录就是项目根目录,因此能正确找到views文件夹;但通过systemd启动时,默认工作目录为根目录/,导致Express尝试在/views下查找模板,而实际模板文件位于/home/ec2-user/lightbox/views,因此出现查找失败。
解决方案
以下两种方法任选其一即可:
方法1:显式指定Express视图目录(推荐)
在server.js中添加代码,明确指定views目录的绝对路径,不受工作目录影响:
// 在设置view engine之后添加 app.set('views', path.join(__dirname, 'views'));
修改后的server.js相关片段:
// handlebars init app.engine('handlebars', hbs.engine); app.set('view engine', 'handlebars'); // 新增:显式指定视图目录 app.set('views', path.join(__dirname, 'views'));
方法2:配置systemd服务的工作目录
在/etc/systemd/system/lightbox.service的[Service]段中添加WorkingDirectory,指定项目根目录:
[Service] ExecStart=/usr/bin/node /home/ec2-user/lightbox/server.js # 新增:设置工作目录为项目根目录 WorkingDirectory=/home/ec2-user/lightbox Restart=always RestartSec=10 StandardOutput=syslog StandardError=syslog SyslogIdentifier=Lightbox User=ec2-user EnvironmentFile=/home/ec2-user/lightbox/lightbox.env
修改后需要重新加载systemd配置并重启服务:
sudo systemctl daemon-reload sudo systemctl restart lightbox.service
验证方式
可在server.js中添加日志打印,确认视图目录路径是否正确:
// 在设置views目录后添加 console.log('当前视图目录:', app.get('views'));
启动应用后查看日志(通过journalctl -u lightbox.service),确认路径为/home/ec2-user/lightbox/views即可。
内容的提问来源于stack exchange,提问作者Finn Phillips

