Node.js中Express路由运行报错无默认引擎未提供扩展名,如何解决?
报错根本原因
这个错误本质是代码中调用了res.render()方法渲染模板,但你注释了Express的模板引擎相关配置,找不到渲染引擎导致抛出异常。同时你存在路由挂载方式错误的问题,大部分接口无法正常匹配,最终走到错误处理逻辑触发了res.render("error")调用。
具体问题及修复方案
1. 路由挂载方法使用错误
你在路由入口index.js中用router.get()挂载子路由,这是完全错误的用法:
router.get()仅用来处理GET类型的请求,无法匹配子路由中定义的POST、DELETE等其他请求方法- 挂载路由中间件必须使用
router.use()
修复方式:将index.js中挂载子路由的代码全部替换为use方法:
// 原来的错误写法 // router.get("/user",userRouter); // router.get("/qeustion",qeustionRouter); // router.get("/questionToTest",questionToTestRouter); // router.get("/test",testRouter); // router.get("/subject",subjectRouter); // 替换为正确写法 router.use("/user",userRouter); router.use("/qeustion",qeustionRouter); router.use("/questionToTest",questionToTestRouter); router.use("/test",testRouter); router.use("/subject",subjectRouter);
注意:你这里的qeustionRouter拼写存在错误,正确拼写应为questionRouter,如果对应文件名是正确的记得同步修改,避免路由加载失败
2. 移除不必要的res.render调用(前后端分离接口场景)
如果你开发的是纯接口服务,不需要服务端渲染页面,可以直接把所有res.render调用替换为接口返回逻辑:
- 替换
index.js根路由的render调用:
// 原来的错误写法 // res.render("index", { title: "Express is run" }); // 替换为 res.json({ title: "Express is run" }); // 或者直接返回文本 res.send("Express is run")
- 替换
app.js中两处错误处理的render调用:
// 开发环境错误处理 app.use(function (err, req, res, next) { res.status(err.status || 500); // 替换res.render为json返回 res.json({ message: err.message, error: err.stack, }); }); // 生产环境错误处理 app.use(function (err, req, res, next) { res.status(err.status || 500); // 替换res.render为json返回 res.json({ message: err.message, error: {}, }); });
3. 保留服务端渲染场景的修复方式
如果你确实需要使用服务端渲染页面,就把app.js中注释的模板引擎配置打开,同时确保:
- 安装对应模板依赖:比如你用jade的话执行
npm install jade views目录下存在index.jade和error.jade两个模板文件
内容的提问来源于stack exchange,提问作者user17376289
相关产品推荐
相关产品推荐

