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

Express结合routing-controllers控制器内axios请求报NotFoundError求助

错误原因

你遇到的NotFoundError是routing-controllers框架的默认逻辑导致的,和axios请求第三方接口本身无关:

  • 你的loadPhoto控制器方法中,axios请求完成后仅在回调中打印了数据,没有返回任何有效值,方法最终的返回值为undefined
  • routing-controllers的响应处理逻辑中,如果控制器方法返回undefined、且没有手动调用Express原生的res.send/end等方法结束响应,会默认判定为请求的资源不存在,自动抛出404 NotFoundError
  • 你单独调用axios没有问题,是因为脱离了routing-controllers的这层返回值校验逻辑,不会触发404判定

另外你当前配置的authorizationChecker永远返回false,后续如果接口加了@Authorized装饰器会被全部拦截,需要根据你的业务逻辑调整鉴权规则。

修复方案

修改控制器代码,确保接口处理完成后返回有效值,推荐用async/await写法逻辑更清晰:

@JsonController('/photo')
@Service()
export class PhotoController {
  constructor(private photoService: PhotoService) {}

  @Get('/load-photos')
  async loadPhoto() {
    try {
      const response = await axios.get('http://jsonplaceholder.typicode.com/photos')
      const photoSlice = response.data.slice(0, 8)
      console.log(photoSlice)
      // 返回结果会被routing-controllers自动序列化为JSON响应给调用方
      return photoSlice
    } catch (e) {
      console.log(e)
      // 抛出错误会被框架的错误处理逻辑捕获返回对应状态码
      throw e
    }
  }
}

如果要保留Promise链式写法,需要在then回调中显式返回结果:

@Get('/load-photos')
loadPhoto() {
  return axios
    .get('http://jsonplaceholder.typicode.com/photos')
    .then((response) => {
      const photoSlice = response.data.slice(0, 8)
      console.log(photoSlice)
      return photoSlice
    })
    .catch((e) => {
      console.log(e)
      throw e
    })
}

修改完成后重新请求接口即可正常返回数据,不会再抛出404错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 20:36:02