Node.js配置EJS出现Failed to lookup view报错的解决方法
报错根因
这个报错不是EJS基础配置错误导致的,核心触发逻辑是:Express运行过程中抛出任意未捕获的异常时,默认会去views目录下查找名为error的视图文件渲染错误页,你当前目录下缺失error.ejs文件,才会抛出这个查找失败的提示。
解决步骤
- 补全缺失的错误视图文件
进入你项目的views目录,新建error.ejs文件,先写最小可用模板验证:
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>服务异常</title> </head> <body> <h1>错误码:<%= error.status || 500 %></h1> <p>错误信息:<%= message %></p> </body> </html>
- 校验配置和依赖正确性
- 确认项目已安装EJS依赖,未安装的话在项目根目录执行命令:
npm install ejs --save - 调整配置顺序,所有视图相关配置必须写在路由挂载之前,正确配置参考:
- 确认项目已安装EJS依赖,未安装的话在项目根目录执行命令:
const express = require('express'); const path = require('path'); const app = express(); // 视图引擎配置 必须放在路由注册前 app.set('view engine', 'ejs'); app.set('views', path.join(__dirname, 'views')); // 静态资源路径统一用path.join拼接,避免跨系统路径符错误 app.use(express.static(path.join(__dirname, 'public'))); // 后续再写路由挂载逻辑 // app.use('/', require('./routes/index'));
- 排查路径隐式问题
- 在配置视图的代码后加一行
console.log(app.get('views')),启动项目后打印的路径要和你实际存放ejs文件的views目录绝对路径完全一致,如果你用进程管理工具启动、或者入口文件不在项目根目录,__dirname取值可能和预期不符 - 进入views目录执行
ls命令,确认文件后缀确实是.ejs,不要出现error.ejs.html这类被系统隐藏真实后缀的情况
- 在配置视图的代码后加一行
- 可选:自定义错误响应
如果不需要渲染EJS错误页,可以在所有路由之后添加自定义错误处理中间件,直接返回JSON等格式的响应,就不会触发查找error.ejs的逻辑:
// 放在所有路由配置之后 app.use((err, req, res, next) => { const statusCode = err.status || 500; res.status(statusCode).json({ code: statusCode, msg: err.message }); });
常见踩坑说明
- 视图配置写在路由挂载之后是高频错误,Express初始化时会先加载路由,触发错误时还未读取到视图配置,就会报视图查找失败
- 用字符串拼接写静态资源/视图路径容易出现斜杠不兼容问题,所有路径处理统一用
path.join可以避免这类问题 - 如果是用express-generator生成的项目,默认自带error.ejs,手动删除该文件后就会触发这个报错,补回即可
内容的提问来源于stack exchange,提问作者Bigc Mobiles
相关产品推荐
相关产品推荐

