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

跨文件调用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 });
  }
};

关键修改点说明

  1. 通用方法返回Promise:让异步操作的结果能被外部捕获,不再提前返回空数组
  2. 主控制器用async/await:把嵌套的then链改成线性的异步写法,逻辑更清晰,确保每一步都等待异步操作完成
  3. 完善错误与边界处理:修复了原代码中else分支引用未定义err的问题,同时补充了参数缺失、菜单不存在的场景处理

这样修改后,主控制器就能正确拿到通用方法返回的数据库查询结果,应该就能得到你期望的输出了。

内容的提问来源于stack exchange,提问作者Destroyer.0211

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:34:46