You need to enable JavaScript to run this app. 学校项目无PHP环境下用JS与Mustache展示SQLite商品及解决getItems未定义报错
优惠活动
大模型
产品
解决方案
定价
更多

学校项目无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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.26 07:36:08