镜像站点 · 本页由第三方 GitHub 只读镜像提供,非 GitHub 官方站点,不接受任何登录或凭据输入。前往 github.com
Skip to content

ECONNRESET after response #27916

Description

@ronag

This was for me a bit of surprising behavior. You can get a connection error after a response.

const http = require('http')

const server = http.createServer(function (req, res) {
  req.on('data', () => {})
  setTimeout(() => {
    // Prematurely ending the request. Usually due to a 5xx error.
    res.statusCode = 200
    res.end()
  }, 1000)
})

server.listen(0, function () {
  const req = http.request({
    port: this.address().port,
    method: 'POST',
    path: '/'
  })
  req.on('response', res => {
    console.log("!", res.statusCode)
    clearInterval(interval)
  })
  const interval = setInterval(() => {
    req.write(Buffer.alloc(32))
  }, 1000)
})

Which sometimes prints:

! 200
events.js:167
      throw er; // Unhandled 'error' event
      ^

Error: read ECONNRESET
    at TCP.onStreamRead (internal/stream_base_commons.js:111:27)
Emitted 'error' event at:
    at Socket.socketErrorListener (_http_client.js:391:9)
    at Socket.emit (events.js:182:13)
    at emitErrorNT (internal/streams/destroy.js:82:8)
    at emitErrorAndCloseNT (internal/streams/destroy.js:50:3)
    at process._tickCallback (internal/process/next_tick.js:63:19)

I can't quite decide if this is wrong or right. I feel like it should either be a response or an error, not both... at least it should be consistent and happen just sometimes... Anyone, got any input?

Activity

  1. ronag commented on May 26, 2019

    @ronag
    MemberAuthor

    I had to run it a few times to get it to fail:

    ^Cnxt$ nodemon test.js 
    [nodemon] 1.19.0
    [nodemon] to restart at any time, enter `rs`
    [nodemon] watching: *.*
    [nodemon] starting `node test.js`
    ! 200
    ^Cnxt$ nodemon test.js 
    [nodemon] 1.19.0
    [nodemon] to restart at any time, enter `rs`
    [nodemon] watching: *.*
    [nodemon] starting `node test.js`
    ! 200
    ^Cnxt$ nodemon test.js 
    [nodemon] 1.19.0
    [nodemon] to restart at any time, enter `rs`
    [nodemon] watching: *.*
    [nodemon] starting `node test.js`
    ! 200
    events.js:167
          throw er; // Unhandled 'error' event
          ^
    
    Error: read ECONNRESET
        at TCP.onStreamRead (internal/stream_base_commons.js:111:27)
    Emitted 'error' event at:
        at Socket.socketErrorListener (_http_client.js:391:9)
        at Socket.emit (events.js:182:13)
        at emitErrorNT (internal/streams/destroy.js:82:8)
        at emitErrorAndCloseNT (internal/streams/destroy.js:50:3)
        at process._tickCallback (internal/process/next_tick.js:63:19)
    [nodemon] app crashed - waiting for file changes before starting...
  2. ronag commented on May 26, 2019

    @ronag
    MemberAuthor

    Adding a abort after response seems to stop the error from being emitted. Even though #20077 is not merged.

  3. ronag commented on May 26, 2019

    @ronag
    MemberAuthor

    I think we should always emit a ECONNRESET error if we get a response to a request which hasn't .end():ed?

  4. lpinca commented on May 26, 2019

    @lpinca
    Member

    It probably happens because the client writes right after the server destroyed the socket (after the response was written).

  5. added
    httpIssues and PRs related to the http subsystem.
    on May 26, 2019
  6. ronag commented on May 26, 2019

    @ronag
    MemberAuthor

    Should this be considered a bug? I can see a lot of potential cases where this can cause surprises... especially where developers might think the requests are "ok", "done", "no worries" after a response and might e.g. remove the error event listener.

  7. lpinca commented on May 26, 2019

    @lpinca
    Member

    I don't know It's a race condition probably hard to fix.

  8. ronag commented on May 26, 2019

    @ronag
    MemberAuthor

    @lpinca How about one of two possible simple mitigations?

    • Don't emit error after response.
    • Don't emit response if request is not ended.
  9. lpinca commented on May 26, 2019

    @lpinca
    Member

    I think both are not viable because there is no guarantee that the full response will be written in a single chunk.

  10. ronag commented on May 26, 2019

    @ronag
    MemberAuthor

    @lpinca just to be clear, what do you think is the correct behavior here?

  11. lpinca commented on May 26, 2019

    @lpinca
    Member

    Not sure if correct but it makes sense.

  12. ronag commented on May 26, 2019

    @ronag
    MemberAuthor

    Do you mean the current behavior?

  13. lpinca commented on May 26, 2019

    @lpinca
    Member

    Yes, it's weird but I can see why it happens.

  14. lpinca commented on May 26, 2019

    @lpinca
    Member

    cc: @nodejs/http

  15. addaleax commented on May 26, 2019

    @addaleax
    Member

    @lpinca It’s not obvious to me why there’s an ECONNRESET in the first place… why is the socket destroyed rather than cleanly .end()ed?

  16. 46 remaining items

  17. im6 commented on Mar 4, 2022

    @im6

    I am also seeing this error.
    strangely that it only happens on one of my js project, i see this constantly when i use webpack-dev-server
    i am using mac M1 version 12.1
    node version 16.14

    node:events:498
          throw er; // Unhandled 'error' event
          ^
    
    Error: read ECONNRESET
        at TLSWrap.onStreamRead (node:internal/stream_base_commons:217:20)
    Emitted 'error' event on ClientRequest instance at:
        at TLSSocket.socketErrorListener (node:_http_client:442:9)
        at TLSSocket.emit (node:events:520:28)
        at emitErrorNT (node:internal/streams/destroy:157:8)
        at emitErrorCloseNT (node:internal/streams/destroy:122:3)
        at processTicksAndRejections (node:internal/process/task_queues:83:21) {
      errno: -54,
      code: 'ECONNRESET',
      syscall: 'read'
    }
  18. Anatanokami commented on Mar 9, 2022

    @Anatanokami

    I am also seeing this error. strangely that it only happens on one of my js project, i see this constantly when i use webpack-dev-server i am using mac M1 version 12.1 node version 16.14

    node:events:498
          throw er; // Unhandled 'error' event
          ^
    
    Error: read ECONNRESET
        at TLSWrap.onStreamRead (node:internal/stream_base_commons:217:20)
    Emitted 'error' event on ClientRequest instance at:
        at TLSSocket.socketErrorListener (node:_http_client:442:9)
        at TLSSocket.emit (node:events:520:28)
        at emitErrorNT (node:internal/streams/destroy:157:8)
        at emitErrorCloseNT (node:internal/streams/destroy:122:3)
        at processTicksAndRejections (node:internal/process/task_queues:83:21) {
      errno: -54,
      code: 'ECONNRESET',
      syscall: 'read'
    }

    +1 here -- exactly the same error when running webpack or webpack-dev-server. Both with 16.14.0 and 17.7.0.

  19. Anatanokami commented on Mar 10, 2022

    @Anatanokami

    @im6 I was able to fix this on my end by removing the import-statement for the Google Font. Both in my repo as well as in the one you linked to this issue. Seems to be a problem with one of the style loaders rather than webpack or Node.

  20. im6 commented on Mar 15, 2022

    @im6

    @im6 I was able to fix this on my end by removing the import-statement for the Google Font. Both in my repo as well as in the one you linked to this issue. Seems to be a problem with one of the style loaders rather than webpack or Node.

    Yes you are right @Anatanokami .
    It is @import() function in .less file that broke the app and emit the error.
    Thanks for pointing out.

  21. jvinhit commented on Mar 31, 2022

    @jvinhit

    I am also seeing this error.
    Error: read ECONNRESET\n at TLSWrap.onStreamRead (internal/stream_base_commons.js:209:20

  22. meznaric commented on May 20, 2022

    @meznaric

    Upgrading Node to 16.15 from 16.14 solved the issue for us.

    Specifically it was happening on webpack start.

  23. mcollina commented on May 20, 2022

    @mcollina
    SponsorMember

    @ronag wdyt?

  24. jmealo commented on Feb 23, 2023

    @jmealo

    I encounter a ton of ECONNRESET on my M1 Mac that other developers can't replicate on x86. I think it may be highly timing depending and my machine is able to reproduce it easily.

  25. bnoordhuis commented on Feb 27, 2023

    @bnoordhuis
    Member

    I can't reproduce this with v19.x on macOS. This issue is almost 4 years old and the http module has gone through a lot of changes in those years. The original bug almost certainly has been fixed.

    Me-too commenters: if you still hit this bug in the latest v18.x or v19.x, please file a new issue and include steps to reproduce.

    If you're seeing it with v16.x or v14.x, you may be out of luck. Those release lines are in maintenance mode and near their end of life.

  26. jmealo commented on Feb 27, 2023

    @jmealo

    @bnoordhuis I made the same assumption with the new HTTP implementation but this seems to one level lower (possibly socket related race condition having to do with event handlers). It's difficult to reproduce in isolation but easy to reproduce in established projects that I can't share the source code to. We should definitely get a new issue opened up even without reproducible steps so that folks don't go crazy trying to debug and can share/collaborate.

  27. aryanbhatt-clvt commented on Jul 22, 2024

    @aryanbhatt-clvt

    Is there a solution for this ? Because it happens on my windows

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    httpIssues and PRs related to the http subsystem.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions