一直想定期写点文章,每次都拖延症发作。今天分享一个在使用laravel开发API时遇到的非常意外的异常。[2020-11-1317:34:03]local.ERROR:传递给Illuminate\\Routing\\Middleware\\ThrottleRequests::addHeaders()的参数1必须是Symfony\\Component\\HttpFoundation\\Response的实例,arraygiven,在/mnt/web/sp-api/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php第133行调用{"exception":"[object](TypeError(code:0):传递给Illuminate\\Routing\\Middleware\\ThrottleRequests::addHeaders()的参数1必须是Symfony\\Component\\HttpFoundation\\Response的实例,给定数组,在/mnt/web/sp-api中调用/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php在第133行位于/mnt/web/sp-api/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php:223)看到很多新手也遇到过这个问题,但是网上并没有明确的答案。这是一个非常奇怪的错误。ThrottleRequests是laravel用来限流的中间件。为什么这里会出现异常?经过断点调试,发现项目中有API请求签名验证中间件,请求验证失败会返回错误信息。返回的内容是一个数组。/***请求时间戳超过有效期*/return['state'=>false,'code'=>40001,'msg'=>'请求时间戳超过有效期'];这个返回是一个不规则的返回,没有返回中间件应该返回的Response实例。正常情况下是没有问题的,但是触发限流的时候。如果ThrottleRequests中间件获取的注入对象不是Response实例,就会抛出异常,很容易找到原因。我们修改一下签名验证中间件,把要返回的数组放到响应体中,然后通过response()方法返回一个响应实例/***请求时间戳超过有效期*/$response_data=return['state'=>false,'code'=>40001,'msg'=>'请求时间戳超过有效期'];返回响应($response_data);问题已经解决了。开发的时候注意不要直接在中间件返回一个数组,而是返回一个Respond到example,这样就不会遇到这种奇奇怪怪的问题,都是开发不规范造成的。
