学校项目无PHP环境下用JS与Mustache展示SQLite商品及解决getItems未定义报错
商品展示问题修复方案
报错原因
当前出现的TypeError: Cannot read property 'getItems' of undefined,根源在Controller层的模块引用逻辑错误:
Controller中现有代码为:
function getProduct(){ const db = require('./../models/models').shopping; return db.getItems(); }
你的Model模块(实现getItems数据库查询的文件)导出结构为{ getItems: [Function] },根本没有shopping这个嵌套属性。因此.shopping取到的是undefined,后续调用getItems就会触发类型错误,加上没有对应的异常捕获,就会出现未处理的Promise拒绝警告。
具体修改步骤
- 修正Controller层的Model引用方式
移除不存在的shopping属性取值,直接调用Model导出的getItems方法:function getProduct(){ const productModel = require('./../models/models'); return productModel.getItems(); } - 为async渲染逻辑补充异常捕获
原有render函数直接await数据库查询结果,没有错误兜底,一旦查询失败就会触发未处理的Promise报错。补充try/catch结构:async function render(req, res){ try { const products = await getProduct(); res.status(200).render('shopping', { items : products }) } catch (err) { // 查询失败时传空数组给模板,避免渲染崩溃 res.status(500).render('shopping', { items : [], errorMsg : '商品加载失败' }) } } - 优化Model层的数据库查询逻辑
原有逻辑中,查询无结果时会触发reject,但正常场景下“商品列表为空”属于合法返回值,不应该按错误处理。调整Promise返回逻辑:function getItems(){ return new Promise((resolve, reject) =>{ db.all(SELECT_PRODUCT_SQL, (err, rows) =>{ if(err) return reject(err); // 无匹配结果时返回空数组,保证模板正常渲染循环 resolve(rows || []); }) }) }
配套校验项
- 确认
require('./../models/models')的路径和实际存储Model文件的位置完全匹配,避免模块引入失败 - 你写的Mustache模板循环语法
{{#items}}本身是合规的,只要items拿到正确的商品数组,就能正常渲染每个商品卡片 - 后续如果要展示商品图片,只需要在SQL查询中增加图片字段的查询,再把模板里注释的img标签src替换为对应的Mustache变量即可
内容的提问来源于stack exchange,提问作者JohnKondo
相关产品推荐
相关产品推荐

