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

