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

Node.js中异步调用request.post返回undefined问题求助

解决异步函数返回undefined的问题

你的问题核心在于异步操作的执行顺序:holidays函数在异步请求完成前就返回了json_content,这时候请求还没拿到数据,所以返回的是初始的空值(表现为undefined)。要解决这个问题,我们需要让holidays函数直接返回Promise,让调用方可以等待异步操作完成后再获取结果。

修正后的data.js代码

module.exports = {
  holidays: function(x, y, z) {
    // 建议将模块引入放在文件顶部,代码更规范
    var Request = require("request");

    function intialize() {
      return new Promise(function(resolve, reject) {
        Request.post({
          "headers": { "content-type": "application/json" },
          "url": "//someurl", // 替换为你的实际API地址
          "body": JSON.stringify({/* 替换为你的请求体内容 */})
        }, function(err, resp, body) {
          if (err) {
            reject(err);
          } else {
            resolve(JSON.parse(body));
          }
        });
      });
    }

    // 直接返回Promise,让调用方可以通过then/await获取异步结果
    return intialize();
  }
};

修正后的调用代码

因为holidays现在返回的是Promise,你需要通过then方法或者async/await来处理结果,而不是直接打印函数返回值:

方式1:使用then链式调用

var h = require(__dirname + '/data.js');
h.holidays('x', 'y', 'z')
  .then(function(result) {
    console.dir(result); // 这里会拿到正确的API返回数据
  })
  .catch(function(err) {
    console.error(err); // 捕获并处理请求错误
  });

方式2:使用async/await(更简洁的写法)

var h = require(__dirname + '/data.js');

async function fetchHolidays() {
  try {
    const result = await h.holidays('x', 'y', 'z');
    console.dir(result);
  } catch (err) {
    console.error(err);
  }
}

fetchHolidays();

原代码的问题解析

你原来的代码里,req.then()是异步执行的回调函数——函数会先执行return(json_content),此时异步请求还没完成,json_content还是初始的空字符串,所以调用方拿到的就是这个空值(表现为undefined)。只有当请求完成后,then的回调才会触发给json_content赋值,但这时候函数早就返回了。

让函数直接返回Promise,就能让调用方等待异步操作完成,确保拿到的是请求成功后的真实数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:07:58