Express+Handlebars渲染空内容且仅显示2个空块问题求助
问题分析与修复方案
问题根源
1. 未执行数据库查询,直接传递模型对象
首页路由中res.render('index', {data: articles})的articles是Mongoose的模型构造函数,不是从数据库查询得到的文章数据数组。Handlebars遍历这个模型对象时,实际是遍历它的内置属性,这就是页面显示2个空块(对应模型内部属性)、且无法获取title/content字段的核心原因。
2. 模型校验规则拼写错误
模型中content字段的必填校验写成了require: true,正确写法应为required: true。虽然当前数据存储正常,但如果提交空内容时会跳过校验,存在数据完整性风险。
修复代码
1. 修改路由代码(执行数据库查询)
const { Router } = require('express') const Article = require('../models/articles') const router = Router() // 首页路由:异步查询所有文章 router.get('/', async (req, res) => { try { // 从MongoDB查询所有文章文档 const articles = await Article.find({}) res.render('index', {data: articles}) } catch (err) { console.error(err) res.status(500).send('服务器错误') } }) router.get('/post', (req, res) => { res.render('post', {isPost: true}) }) router.post('/post', async (req, res) => { try { const article = new Article({ title: req.body.title, content: req.body.content }) await article.save() res.redirect('/') } catch (err) { console.error(err) res.status(400).send('提交失败') } }) module.exports = router
2. 修正模型代码的拼写错误
const { Schema, model } = require('mongoose') const schema = new Schema({ title: { type: String, required: true }, content: { type: String, required: true // 修正require为required } }) module.exports = model('Article', schema)
修复效果
修改后,首页路由会从MongoDB中查询所有文章数据,将真实的文档数组传递给Handlebars模板。模板遍历数组时,就能正确读取每个文章的title和content字段,渲染出所有完整的文章内容,不会再出现空块。
内容的提问来源于stack exchange,提问作者Anisimov
相关产品推荐
相关产品推荐

