本文作者:开源技术之家

[vue-element-admin]前端发送的post请求的数据,后端接收不到并报EOFException异常的解决方案

开源技术之家 1个月前 ( 09-23 ) 208 抢沙发

最近在做的以后后台管理的项目,采用前后端分离的方式进行开发,前端采用的是 vue-element-admin 版本,版本为4.2.1,后端服务使用的是springboot进行开发,接口数据交互遵循restful风格进行封装。
在这里一定要说明一下,使用 vue-element-admin 模板,不是说从git上pull下来就能直接用的,一定要先看一下官方文档
本次出现的问题就是没有看官方文档导致的!具体情况下面详细说明。
先上代码:
后端服务接口代码如下:


@RestController@RequestMapping(value = "/sys/dict")public class AuthSysDictController {     private static Logger logger = CommonUtils.getLog(AuthSysDictController.class);     @Resource    private AuthSysDictService authSysDictService;     @PostMapping(value = "add")    public Result add(@RequestBody AuthSysDict dict, HttpServletRequest request) {        logger.debug("dict-update-----" + Json.toJson(dict));        authSysDictService.add(dict);        return Result.success("添加成功", dict);    }}
前端请求接口的代码如下:


/** * 新增字典记录 * @param data * @returns {AxiosPromise} */export function dictAdd(data) {  return request({    url: '/sys/dict/add',    method: 'post',    data  })}
问题:后端服务接口同通过postman工具,以及手写HTTPClient测试,均能获取请求数据,说明后端的服务接口是没有问题的。
在用vue-element-admin封装的request.js工具类发送post请求时,后端服务接口获取不到request请求体的内容,并返回异常信息java.io.EOFException: Unexpected EOF read on the socket。
具体异常信息如下:


org.springframework.http.converter.HttpMessageNotReadableException: I/O error while reading input message; nested exception is java.io.EOFException: Unexpected EOF read on the socket  at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:216)  at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:157)  at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:130)  at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:126)  at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:166)  at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:134)  at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)  at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)  at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:800)  at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)  at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1038)  at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)  at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)  at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:908)  at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)  at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)  at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)  at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)  at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)  at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)  at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)  at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)  at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)  at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449)  at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365)  at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)  at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)  at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383)  at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362)  at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)  at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)  at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)  at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92)  at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)  at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93)  at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)  at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)  at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)  at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)  at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)  at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)  at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)  at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)  at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)  at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)  at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)  at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)  at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:791)  at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1417)  at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)  at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)  at java.lang.Thread.run(Thread.java:748)Caused by: java.io.EOFException: Unexpected EOF read on the socket  at org.apache.coyote.http11.Http11InputBuffer.fill(Http11InputBuffer.java:734)  at org.apache.coyote.http11.Http11InputBuffer.access$300(Http11InputBuffer.java:40)  at org.apache.coyote.http11.Http11InputBuffer$SocketInputBuffer.doRead(Http11InputBuffer.java:1061)  at org.apache.coyote.http11.filters.IdentityInputFilter.doRead(IdentityInputFilter.java:102)  at org.apache.coyote.http11.Http11InputBuffer.doRead(Http11InputBuffer.java:245)  at org.apache.coyote.Request.doRead(Request.java:551)  at org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:318)  at org.apache.catalina.connector.InputBuffer.checkByteBufferEof(InputBuffer.java:611)  at org.apache.catalina.connector.InputBuffer.readByte(InputBuffer.java:329)  at org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:84)  at java.io.FilterInputStream.read(FilterInputStream.java:83)  at java.io.PushbackInputStream.read(PushbackInputStream.java:139)  at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver$EmptyBodyCheckingHttpInputMessage.<init>(AbstractMessageConverterMethodArgumentResolver.java:324)  at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:193)  ... 67 common frames omitted
最终,问题是出在 vue-element-admin 模板中自带mock模块上。
request请求体是流式数据,如果在其他地方消费过,不做特殊处理的话,后面的应用就消费不到了。
前端通过node转发到后端应用,思考了半天,觉得只有mock才会影响到request请求体,所以去mock-server.js中去查看。

果然,在mock中有对于request请求体的处理逻辑,此处消费了requestBody,导致在node转发时,request请求体丢失。从而导致传到后端没有请求体,但是后端在解析的时候发现request请求头的content-length是有值的,就一直等待接收数据,与此同时,前端也在等待后端返回结果。当超过设置的请求时长后,前端等待超时,前端发EOF请求(具体为何会发EOF还需要进一步学习),后端收到以后,发现和预期的消息不一致,就报了EOF这个错误。
解决方式:
1. 将mock-server.js中的关于处理请求体的两行代码注释,重新启动项目即可。

2. 因为是实际的项目开发,直接将模板中关于mock的相关配置注释掉或者直接删除。
mock在 vue-element-admin 中有两个相关配置,分别在 main.js 和 vue.config.js 中,具体位置如下。

main.js


vue.config.js中:



本篇文章来源于微信公众号:                         code writer

本文标题:[vue-element-admin]前端发送的post请求的数据,后端接收不到并报EOFException异常的解决方案
本文链接:https://www.kyjszj.com/htzq/2306.html
作者授权:除特别说明外,本文由 开源技术之家 原创编译并授权 开源技术之家 刊载发布。
版权声明:本文不使用任何协议授权,您可以任何形式自由转载或使用。
文章版权及转载声明

作者:开源技术之家本文地址:https://www.kyjszj.com/htzq/2306.html发布于 1个月前 ( 09-23 )
文章转载或复制请以超链接形式并注明出处开源技术之家

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

阅读
分享

发表评论

快捷回复:

评论列表 (暂无评论,208人围观)参与讨论

还没有评论,来说两句吧...