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

Node.js中如何从Helper正确传递MySQL Promise查询数据?

解决Node.js中Helper模块传递MySQL Promise查询数据返回undefined的问题

这个问题我之前也碰到过!核心原因是你的getLokasi函数没有返回异步操作的Promise,导致控制器调用它时,异步查询还没完成就拿到了默认的undefined。

问题根源拆解

在helper.js里,Master.fetchAll()返回的是一个Promise,但你只是调用了它的.then()回调,却没有把整个Promise链作为getLokasi函数的返回值。.then()里的return hasil只是回调函数的返回值,并不会让getLokasi本身返回这个结果——函数本身没有任何return语句,所以默认返回undefined。

修复步骤

1. 修改Helper模块,返回Promise链

更新helper.js,让getLokasi返回完整的Promise,同时在catch中抛出错误,方便控制器统一处理:

const Master = require('../models/inspection');
module.exports = {
  getLokasi: function (x) {
    // 关键:返回整个Promise链
    return Master.fetchAll()
      .then(([result]) => {
        const hasil = result;
        return hasil;
      })
      .catch(err => {
        console.log(err);
        // 抛出错误,让控制器可以捕获处理
        throw err;
      });
  }
}

2. 在控制器中用异步方式获取数据

现在getLokasi返回Promise了,控制器需要通过.then()或async/await来等待异步操作完成,获取数据:

方式一:使用.then()链式调用
const helpers = require('../../util/helpers');
exports.getInspectionDetail = (req, res, next) => {
  helpers.getLokasi()
    .then(test => {
      console.log(test); // 这里就能拿到正确的数据了
      // 后续可以处理响应,比如 res.render() 或 res.json()
    })
    .catch(err => {
      // 统一处理错误
      next(err);
    });
}
方式二:使用async/await(更简洁)
const helpers = require('../../util/helpers');
// 给控制器函数加上async关键字
exports.getInspectionDetail = async (req, res, next) => {
  try {
    const test = await helpers.getLokasi();
    console.log(test); // 正确获取数据
    // 处理响应逻辑
  } catch (err) {
    console.log(err);
    next(err);
  }
}

额外说明

异步操作(比如数据库查询)不会立即返回结果,Promise就是用来管理这种异步流程的。通过让Helper返回Promise,控制器可以明确等待异步操作完成,从而拿到正确的查询结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 16:32:34