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
相关产品推荐
相关产品推荐

