Express路由传递errorMessage至EJS局部视图报错及实现问询
解决Express路由传递errorMessage到EJS局部视图的问题
我来帮你搞定这个报错问题~你遇到的ReferenceError是因为布局文件全局引入了errorMessage.ejs,但不是所有路由都传递了errorMessage变量。比如访问/或者/new时,你的路由没有传这个变量,EJS渲染局部视图时找不到它就会抛出错误。
下面给你几个可行的解决方案:
方案1:给所有路由的渲染数据添加默认的errorMessage
在每个路由的res.render里都带上errorMessage,没有错误时就传空字符串:
// All Character router.get("/", (req, res) => { res.render("characters/index", { errorMessage: '' }); }); // New Character router.get("/new", (req, res) => { res.render("characters/new", { character: new Character(), errorMessage: '' }); }); // Creat(保留原有错误处理逻辑) router.post("/", (req, res) => { const character = new Character({ name: req.body.name, }); character.save((err, newCharacter) => { if (err) { res.render("characters/new", { character: character, errorMessage: "Error Creating" }); } else { res.redirect("characters"); } }); });
方案2:在局部视图里先判断变量是否存在
修改errorMessage.ejs,先检查errorMessage是否定义且有内容,再渲染:
<% if (typeof errorMessage !== 'undefined' && errorMessage) { %> <div style="color: red; padding: 10px; border: 1px solid red;"> <%= errorMessage %> </div> <% } %>
这种方法最灵活,不需要修改所有路由,只有当错误信息存在时才会显示,其他情况自动跳过,不会报错。
方案3:仅在需要的页面引入错误视图
从布局文件里删掉全局的<%- include("../views/partials/errorMessage.ejs") %>,只在需要显示错误的页面(比如characters/new.ejs)里添加这个局部视图的引入:
<!-- 在characters/new.ejs的合适位置添加 --> <%- include("../partials/errorMessage.ejs") %>
这样只有当渲染new页面且路由传了errorMessage时,才会加载这个局部视图,其他页面不受影响。
个人更推荐方案2,它既能避免全局报错,还能让你自定义错误信息的显示样式,适配不同场景的需求。
内容的提问来源于stack exchange,提问作者Aakash Khanal
相关产品推荐
相关产品推荐

