initFoodModel调用报错排查:非函数及findAll读取未定义属性问题
问题:调用
initFoodModel时报错且无法读取findAll属性 报错信息
initFoodModel is not a functionCannot 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
相关产品推荐
相关产品推荐

