存在JSON对象但EJS模板无法渲染指定数据的问题
EJS模板渲染指定字段失败的解决方法
问题原因
你的路由代码中使用Recept.find()查询数据,这个方法返回的是匹配文档的数组,而非单个对象。因此传递给EJS模板的recept是数组类型,直接访问recept.title、recept.image这类属性自然无法获取到值,但渲染整个数组会输出完整的JSON字符串。
解决方案
有两种可行的修改方式:
方式一:改用findOne()查询单个文档
将查询方法替换为Recept.findOne(),它会直接返回匹配的单个文档对象,无需额外处理:
router.get("/:slug", function(req, res) { Recept.findOne({ slug: req.params.slug}) .exec(function(err, foundRecept) { if(err || !foundRecept) { req.flash("error", "未找到食谱"); res.redirect("back"); } else { res.render("recepten/recept", { recept: foundRecept }); } }); });
方式二:从数组中取出第一个元素传递给模板
如果需要保留find()方法,在渲染模板时取数组的第一个元素(因为slug通常是唯一的,数组只会有一个元素):
router.get("/:slug", function(req, res) { Recept.find({ slug: req.params.slug}) .exec(function(err, foundRecept) { if(err || !foundRecept || foundRecept.length === 0) { req.flash("error", "未找到食谱"); res.redirect("back"); } else { // 取数组第一个元素传递 res.render("recepten/recept", { recept: foundRecept[0] }); } }); });
修改完成后,EJS模板中的<%= recept.title %>、<%= recept.image %>即可正常渲染对应字段。
内容的提问来源于stack exchange,提问作者Jssonline
相关产品推荐
相关产品推荐

