You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

initFoodModel调用报错排查:非函数及findAll读取未定义属性问题

问题:调用initFoodModel时报错且无法读取findAll属性

报错信息

  • initFoodModel is not a function
  • Cannot read properties of undefined (reading 'findAll')

需求

验证指定food_id是否存在于wishlist中

问题场景

已确认initFoodModel定义正常,但仅在wishList.js中调用该方法时触发报错,直接调用(如listFood.js注释代码)则运行正常。


相关代码

wishList.js

const { initFoodModel } = require("../../model/FoodModel");
const { initWishlistModel } = require("../../model/wishListModel");
const initWishlistModel = async () => {
try {
const sequelize = await getConnection();
const Food = await initFoodModel()
const User = await initUserModel()
const Wishlist = sequelize.define("Wishlist", wishlistModel, {
freezeTableName: true,
});

        Wishlist.belongsTo(Food, { foreignKey: 'Food_id', targetKey: 'Food_id' });
        Wishlist.belongsTo(User, { foreignKey: 'user_id' });
        await Wishlist.sync({ alter: true });
        return Wishlist;
    } catch (err) {
        console.log(err.message);
    }

};

module.exports = { initWishlistModel };

listFood.js

const  {initWishlistModel}  = require("../../model/wishListModel");
const { initFoodModel } = require("../../model/FoodModel");
const getFood = async (req, res) => {
try {
const { Food_id } = req.params
const user_id = req.token.user.id;
console.log(req.token.user.id);
const schema = await initFoodModel();

        const wishlist = await initWishlistModel();
    
        let isWishlisted = await wishlist.findAll({ where: { Food_id: Food_id, user_id: user_id } })
        console.log(isWishlisted);
    
        if (isWishlisted) {
            return send(res, RESPONSE.SUCCESS, "already wishlisted")
        }
        return send(res, RESPONSE.ERROR })
    
    
    
    // let check = await schema.findOne({ where: { Food_id: Food_id, stat: true }, });
    // if (check.length === 0) {

// return send(res, RESPONSE.ITM_NOT_FOUND);
 // }
 // return send(res, RESPONSE.SUCCESS, { check })

} catch (err) {
console.log(err.message);
return send(res, RESPONSE.ERROR, err.stack)
}
};

解决方案

1. 修复initFoodModel is not a function报错

问题出在循环引用+冗余导入:

  • wishList.js里自己导入了initWishlistModel,但当前文件就是定义这个函数的地方,完全没必要,这会导致模块加载逻辑混乱。
  • 代码里调用了initUserModel但没导入,这也是潜在错误。

修改wishList.js开头部分:

const { initFoodModel } = require("../../model/FoodModel");
const { initUserModel } = require("../../model/UserModel"); // 补充UserModel的导入
// 删除冗余的const { initWishlistModel } = require("../../model/wishListModel");
const initWishlistModel = async () => {
// ... 原有逻辑保留
}

2. 修复Cannot read properties of undefined (reading 'findAll')报错

这个错误是因为initWishlistModel执行出错时,catch块只打印错误却没抛出,导致上层拿到undefined,调用findAll自然报错。

第一步:修改initWishlistModel的catch块

catch (err) {
    console.log(err.message);
    throw err; // 抛出错误让上层捕获,避免返回undefined
}

第二步:完善listFood.js的调用逻辑

  • 先判断wishlist模型是否初始化成功
  • findAll返回的是数组,判断是否存在要用长度,而非直接判断数组本身
  • 修复语法错误:return send(res, RESPONSE.ERROR })缺少参数

修改后代码片段:

const wishlist = await initWishlistModel();
if (!wishlist) {
    return send(res, RESPONSE.ERROR, "wishlist模型初始化失败");
}
let isWishlisted = await wishlist.findAll({ where: { Food_id: Food_id, user_id: user_id } });

if (isWishlisted.length > 0) {
    return send(res, RESPONSE.SUCCESS, "已在wishlist中");
}
return send(res, RESPONSE.ERROR, "未在wishlist中找到该食品");

3. 额外优化建议

  • 模型初始化不需要每次请求都执行,建议在项目启动时全局初始化一次,提升性能
  • 统一错误处理逻辑,避免遗漏错误抛出

内容的提问来源于stack exchange,提问作者shashank

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 04:16:00