跨文件调用Sequelize.findAll时导出函数无数据返回问题
解决主控制器无法获取通用方法异步返回数据的问题
这问题我之前也踩过坑!核心原因是你的menuDetails函数里的数据库查询是异步操作,但函数本身没有返回这个异步任务的Promise,导致主控制器里的menu_details直接拿到了初始的空数组[],根本等不到数据库查询的结果。
咱们一步步来修复:
第一步:修改通用方法文件,让它返回Promise
把menuDetails改成返回一个Promise,这样外部就能等待它的异步操作完成:
const MenuRelationalModel = require('../../models/menu/menuRelationModel'); exports.menuDetails = (content_data) => { // 返回Promise包裹异步逻辑 return new Promise((resolve, reject) => { if (!content_data || !(content_data.id && content_data.id === 1)) { return resolve([]); } MenuRelationalModel.findAll({ where: { menu_id: content_data.id } }).then(menu_all_data => { const data = menu_all_data.map(menu_item => menu_item.dataValues); resolve(data); }).catch(err => { reject(err); }); }); };
或者更简洁的链式Promise写法:
const MenuRelationalModel = require('../../models/menu/menuRelationModel'); exports.menuDetails = (content_data) => { if (!content_data || !(content_data.id && content_data.id === 1)) { return Promise.resolve([]); } return MenuRelationalModel.findAll({ where: { menu_id: content_data.id } }).then(menu_all_data => menu_all_data.map(item => item.dataValues)); };
第二步:修改主控制器,用async/await处理异步调用
把listMenu改成async函数,调用menuDetails时用await,确保拿到异步结果后再返回响应:
const MenuData = require('../../models/common/MenuData'); const MenuModel = require('../../models/menu/menuModel'); exports.listMenu = async function(req, res) { try { if (!req.query.menuID) { return res.send({ status: 400, message: "Missing menuID parameter" }); } const menu_id = req.query.menuID; const menu = await MenuModel.findOne({ where: { id: menu_id } }); if (!menu) { return res.send({ status: 302, message: "Menu Not Found" }); } const menu_details = await MenuData.menuDetails(menu.dataValues); if (menu_details.length > 0) { return res.send({ status: 200, message: menu_details }); } else { return res.send({ status: 302, message: "Data Not Found" }); } } catch (err) { return res.send({ status: 500, message: 'error: ' + err }); } };
关键修改点说明
- 通用方法返回Promise:让异步操作的结果能被外部捕获,不再提前返回空数组
- 主控制器用async/await:把嵌套的
then链改成线性的异步写法,逻辑更清晰,确保每一步都等待异步操作完成 - 完善错误与边界处理:修复了原代码中
else分支引用未定义err的问题,同时补充了参数缺失、菜单不存在的场景处理
这样修改后,主控制器就能正确拿到通用方法返回的数据库查询结果,应该就能得到你期望的输出了。
内容的提问来源于stack exchange,提问作者Destroyer.0211
相关产品推荐
相关产品推荐

