返回顶部
  • 发帖数48
  • 粉丝1

北京音视跳动首席架构师。拥有10多年的音视频实时互动直播研发经验,多年团队管理经验。参加并设计了多个高负载,大并发服务器架构。曾在全时云会议担任研发经理,带领团队研发同时进行10000场会议的音视频会议平台。曾在跟谁学团队担任直播研发高级经理,带领团队研发在线教育直播平台,同一教室内可支持上万人。

[开发语言] 分析一下莫名其妙的 ThrottleRequests::addHeaders()异常

[复制链接]
admin 显示全部楼层 发表于 2020-12-1 10:43:28 |阅读模式 打印 上一主题 下一主题
一直想要定期写一些文章,每次都拖延症发作。
今天来分享一个在使用laravel 开发 api的时候遇见的一个很偶然间的异常。


[2020-11-13 17:34:03] local.ERROR: Argument 1 passed to Illuminate\\Routing\\Middleware\\ThrottleRequests::addHeaders() must be an instance of Symfony\\Component\\HttpFoundation\\Response, array given, called in /mnt/web/sp-api/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php on line 133 {"exception":"[object] (TypeError(code: 0): Argument 1 passed to Illuminate\\Routing\\Middleware\\ThrottleRequests::addHeaders() must be an instance of Symfony\\Component\\HttpFoundation\\Response, array given, called in /mnt/web/sp-api/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php on line 133 at /mnt/web/sp-api/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php:223)


看到有很多新手也遇见了这个问题,但是网上并没有什么明确的答案。
这是个很奇怪的错,ThrottleRequests是laravel用来进行限流的中间件,为什么会在这里出现异常?
断点调试之后发现 ,在项目中有一个 API请求签名验证中间件,当请求验证失败时会返回一个错误消息。
返回的内容是一个数组。
  1. /**
  2. * 请求时间戳超过有效期
  3. */
  4. return ['state'=>false,'code'=>40001,'msg'=>'请求时间戳超过有效期'];
复制代码


这个返回是一个不规范的返回,没有返回中间件应该返回的 Response 实例。
在一般情况下没有问题,但是当触发了限流之后。ThrottleRequests中间件拿到的注入对象不是Response实例就会出现抛出异常,找到了原因就好办了。
我们修改一下签名验证中间件,将要返回的数组放到响应body中,然后通过response()方法返回一个response实例

  1. /**
  2. * 请求时间戳超过有效期
  3. */
  4. $response_data =  return ['state'=>false,'code'=>40001,'msg'=>'请求时间戳超过有效期'];
  5. return response($response_data);
复制代码

问题解决,开发中要注意不要在中间件中直接返回数组,而是要返回一个响应实例,这样就不会遇见这种诡异的问题,都是不按规范开发导致的。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

星点互联 成立于2014年8月,是目前国内优秀的开源技术社区,拥有超过300万会员,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作