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

