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

Node.js使用request包调用函数返回undefined问题求助

问题分析

你的代码有三个核心问题导致返回undefined:

  • request是异步回调式的API,catFact函数本身没有任何返回语句,调用它默认返回undefined
  • 回调函数里的return(body.fact)只是回调函数自身的返回值,不会传递到catFact的调用层级
  • 接口返回的body是JSON格式的字符串,直接访问body.fact会得到undefined,必须先解析成JavaScript对象
修复方案

方案1:用Promise封装异步逻辑

把catFact改成返回Promise的函数,通过.then()获取结果:

import request from "request";

const catFact = () => {
  return new Promise((resolve, reject) => {
    request('https://catfact.ninja/fact', (error, response, body) => {
      if (error) {
        reject(error);
        return;
      }
      // 把字符串转成JSON对象
      const data = JSON.parse(body);
      resolve(data.fact);
    });
  });
}

// 调用方式
catFact().then(fact => {
  console.log(fact);
}).catch(err => {
  console.error('请求失败:', err);
});

方案2:使用async/await简化代码

基于方案1的Promise封装,用async/await让异步代码看起来像同步:

import request from "request";

const catFact = () => {
  return new Promise((resolve, reject) => {
    request('https://catfact.ninja/fact', (error, response, body) => {
      if (error) {
        reject(error);
        return;
      }
      const data = JSON.parse(body);
      resolve(data.fact);
    });
  });
}

// 必须在async函数里使用await
async function getCatFact() {
  try {
    const fact = await catFact();
    console.log(fact);
  } catch (err) {
    console.error('请求失败:', err);
  }
}

getCatFact();

额外提示:使用request的Promise版本

如果可以更换依赖,推荐用request-promise(request的Promise封装版),代码更简洁:

import request from "request-promise";

const catFact = async () => {
  // 开启json: true会自动解析body为JSON对象
  const data = await request('https://catfact.ninja/fact', { json: true });
  return data.fact;
}

async function getCatFact() {
  try {
    console.log(await catFact());
  } catch (err) {
    console.error('请求失败:', err);
  }
}

getCatFact();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 01:01:07