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

Node.js调用封装axios请求的模块方法返回undefined如何解决

代码调整方案

问题本质

axios是异步请求库,axios.get()返回的是Promise实例,你当前的Plays函数没有返回该Promise实例,且异步回调内的return值无法被外层同步代码直接捕获,所以最终拿到的是undefined。
注意:所有需要依赖播放数Plays的业务逻辑,必须写在异步回调内部,不能在同步代码位置直接获取返回值

第一步:修改模块文件代码

修改后的代码如下:

const axios = require('axios');
const keys = require('../../../../keys/lfmconfig.json')

const Plays = (f,t,a) => {
  const requestURL = `http://ws.audioscrobbler.com/2.0/?method=track.getInfo&api_key=${keys.apikey}&username=${f}&artist=${a}&track=${t}&format=json`
  // 新增return,把axios返回的Promise暴露给外部调用
  return axios.get(requestURL)
  .then((response) => {
    console.log(response.data.track.userplaycount) 
    return response.data.track.userplaycount
  })
  // 可选:增加错误捕获,方便上层处理异常
  .catch(err => {
    console.error('请求播放数接口出错:', err)
    throw err
  })
}

exports.Plays = Plays

第二步:修改入口文件代码,两种实现方式可选

方式1:使用.then()链式调用

const track = require('./components/trackPlays')
track.Plays(username, expT, expA)
.then(Plays => {
  // 此处即可正常拿到播放数,后续逻辑都写在then回调内
  console.log('获取到的播放数为:', Plays)
})
.catch(err => {
  // 处理请求异常
})

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

const track = require('./components/trackPlays')

// 所有异步逻辑需要包在async函数内,这里用自执行async函数举例
(async () => {
  try {
    const Plays = await track.Plays(username, expT, expA)
    // 此处即可正常拿到播放数
    console.log('获取到的播放数为:', Plays)
  } catch (err) {
    // 处理请求异常
    console.error('获取播放数失败:', err)
  }
})()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 01:24:03