Web3js

web3 websocket連接阻止節點程序退出

  • January 28, 2022

我有一個創建 web3 websocket 連接的節點 js 程序,如下所示:

web3 = new Web3('ws://localhost:7545')

當程序完成時,它不會退出,而是永遠掛起,沒有控制台輸出。

看看用 and 處理該過程的突出之處process._getActiveRequests()process._getActiveHandles()我看到了這一點:

Socket {
   connecting: false,
   _hadError: false,
   _handle: 
    TCP {
      reading: true,
      owner: [Circular],
      onread: [Function: onread],
      onconnection: null,
      writeQueueSize: 0 },
   <snip>
   _peername: { address: '127.0.0.1', family: 'IPv4', port: 7545 },
   <snip>
}

看起來 web3 正在打開一個套接字,這是有道理的,因為我從未告訴它關閉連接。查看文件和Google搜尋,看起來 web3 對像沒有 close 或 end 方法。

手動關閉socket可以讓程序成功退出:

web3.currentProvider.connection.close()

有人有更優雅或官方認可的解決方案嗎?我覺得很有趣,您必須手動執行此操作,而不是讓對像在程序結束時自行銷毀。

WebSockets 提供客戶端和伺服器之間的持久連接。必須手動關閉此連接,否則庫會嘗試保持連接處於活動狀態。

我覺得很有趣,您必須手動執行此操作,而不是讓對像在程序結束時自行銷毀。

除非所有連接和方法都結束,否則該過程不會結束。Node.js 不會關閉您的連接。

如果您希望您的程序退出或呼叫,您必須關閉您的持久連接process.exit(0)

我在文件中找不到對此的任何引用,但disconnect()提供程序上有一個方法,所以這有效:

web3.currentProvider.disconnect();

在他們的程式碼中被使用

引用自:https://ethereum.stackexchange.com/questions/50134