Tedious: ConnectionError: Koneksi terputus - tulis ECONNRESET saat memasukkan string panjang

Dibuat pada 16 Jul 2019  ·  9Komentar  ·  Sumber: tediousjs/tedious

Saya memiliki tabel di Database Azure SQL.

CREATE TABLE [dbo].[Owner](
    [OwnerId] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
    [Name] [varchar](50) NOT NULL,
    [Signature] [varchar](max) NULL
)

Saya mencoba memasukkan string yang sangat panjang ke kolom Tanda Tangan. Jika packetSize tidak disetel ke 16384 atau lebih tinggi, saya mendapatkan pengecualian berikut:

ConnectionError: Connection lost - write ECONNRESET
    at ConnectionError (C:\work\GitRepos\tedious-test\node_modules\tedious\lib\errors.js:13:12)
    at Connection.socketError (C:\work\GitRepos\tedious-test\node_modules\tedious\lib\connection.js:1187:26)
    at Socket.<anonymous> (C:\work\GitRepos\tedious-test\node_modules\tedious\lib\connection.js:1032:14)
    at Socket.emit (events.js:205:15)
    at errorOrDestroy (internal/streams/destroy.js:107:12)
    at onwriteError (_stream_writable.js:438:5)
    at onwrite (_stream_writable.js:459:5)
    at internal/streams/destroy.js:49:7
    at Socket._destroy (net.js:593:3)
    at Socket.destroy (internal/streams/destroy.js:37:8)
Emitted 'error' event at:
    at Connection.socketError (C:\work\GitRepos\tedious-test\node_modules\tedious\lib\connection.js:1187:12)
    at Socket.<anonymous> (C:\work\GitRepos\tedious-test\node_modules\tedious\lib\connection.js:1032:14)
    [... lines matching original stack trace ...]
    at Socket.destroy (internal/streams/destroy.js:37:8)
    at WriteWrap.onWriteComplete [as oncomplete] (internal/stream_base_commons.js:84:12) {
  message: 'Connection lost - write ECONNRESET',
  code: 'ESOCKET'
}

Di bawah ini adalah program pengujian sederhana saya. Saya menggunakan membosankan terbaru. Juga operasi baca tampaknya berfungsi dengan baik untuk string panjang tidak peduli berapa ukuran paketnya. Tahu apa yang saya lakukan salah?

var Connection = require('tedious').Connection;

var config = {
  server: "myserver.database.windows.net",
  options: {
    encrypt: true,
    database: "<mydb>",
    packetSize: 4096,
  },
  authentication: {
    type: "default",
    options: {  
      userName: "<myuser>",
      password: "<mypwd>",
    }
  }
};

var connection = new Connection(config);

connection.on('connect', function(err) {
    // executeStatement();
    executeInsert();
  }
);


var Request = require('tedious').Request;

function executeStatement() {
  /* Read a long string, work fine */
  request = new Request("select OwnerId, Signature From dbo.Owner Where OwnerId = 36", function(err, rowCount) {
    if (err) {
      console.log(err);
    } else {
      console.log(rowCount + ' rows');
    }
  });

  request.on('row', function(columns) {
    columns.forEach(function(column) {
      console.log(column.value);
    });
  });

  connection.execSql(request);
}


function executeInsert() {
  /************************************************
   * Insert a long string, not working when
   *     packetSize = 4096
   * If
   *     packetSize = 16384
   * or higher, insertion works fine.
   *****************************************************/
  let s = '0123456789'.repeat(100000);
  request = new Request("Insert into dbo.Owner VALUES ('Rick', '" + s + "')", function(err, rowCount) {
    if (err) {
      console.log(err);
    } else {
      console.log(rowCount + ' rows');
    }
  });

  connection.execSql(request);
}
released

Komentar yang paling membantu

Mendapat Connection lost - read ECONNRESET saat menjalankan kueri panjang. Dengan encrypt: true dan packetSize: 32768 , semuanya berfungsi dengan baik.

versi simpul: v12.6.0

Semua 9 komentar

Kami mengalami masalah serupa. ketika mencoba memasukkan string panjang. Setelah sedikit pengujian ternyata, bagi kami itu terkait dengan versi nodejs yang digunakan dalam kasus kami di-docker.
simpul: 10-slim -> berfungsi dengan baik
simpul:12.3.1 -> berfungsi dengan baik
simpul awal:12.4 menghasilkan kesalahan soket hangup atau soket tertutup.

Hai @ricklang , saya sedang mencari ini. Apakah "enkripsi: benar" pengaturan yang diperlukan di pihak Anda? Jika tidak, maka setel ke false atau jangan setel di opsi yang menggunakan nilai default -false juga dapat menyelesaikan masalah ini. Saya mencoba mencari tahu mengapa ini terjadi, tetapi saya belum menemukan akar penyebabnya. Saya memeriksa paket untuk koneksi enkripsi dan non-enkripsi, paketnya persis sama, tetapi untuk mengenkripsi satu, ketika paket terakhir dengan EOM diterima, kesalahan koneksi yang hilang diterima. Saya akan memberikan sedikit penyelidikan lebih lanjut, lihat apakah saya bisa menggali apa pun.
Di sisi lain, kita juga bisa bertanya kepada @arthurschreiber tentang ini, lihat apakah dia punya wawasan.

Dengan

encrypt: false,

Pesan kesalahannya adalah (berapa pun ukuran paketnya):

RequestError: Requests can only be made in the LoggedIn state, not the SentPrelogin state
    at RequestError (C:\work\GitRepos\tedious-test\node_modules\tedious\lib\errors.js:32:12)
    at Connection.makeRequest (C:\work\GitRepos\tedious-test\node_modules\tedious\lib\connection.js:1680:24)
    at Connection.execSql (C:\work\GitRepos\tedious-test\node_modules\tedious\lib\connection.js:1459:10)
    at executeInsert (C:\work\GitRepos\tedious-test\index.js:67:14)
    at Connection.<anonymous> (C:\work\GitRepos\tedious-test\index.js:24:5)
    at Connection.emit (events.js:200:13)
    at Connection.message (C:\work\GitRepos\tedious-test\node_modules\tedious\lib\connection.js:1871:18)
    at Connection.dispatchEvent (C:\work\GitRepos\tedious-test\node_modules\tedious\lib\connection.js:1172:36)
    at MessageIO.<anonymous> (C:\work\GitRepos\tedious-test\node_modules\tedious\lib\connection.js:1045:14)
    at MessageIO.emit (events.js:200:13) {
  message: 'Requests can only be made in the ' +
    'LoggedIn state, not the SentPrelogin ' +
    'state',
  code: 'EINVALIDSTATE'

Jika hapus pengaturan enkripsi, tetapi biarkan ukuran paket di 4096, pesan kesalahannya adalah:

ConnectionError: Connection lost - write ECONNRESET
    at ConnectionError (C:\work\GitRepos\tedious-test\node_modules\tedious\lib\errors.js:13:12)
    at Connection.socketError (C:\work\GitRepos\tedious-test\node_modules\tedious\lib\connection.js:1187:26)
    at Socket.<anonymous> (C:\work\GitRepos\tedious-test\node_modules\tedious\lib\connection.js:1032:14)
    at Socket.emit (events.js:205:15)
    at errorOrDestroy (internal/streams/destroy.js:107:12)
    at onwriteError (_stream_writable.js:438:5)
    at onwrite (_stream_writable.js:459:5)
    at internal/streams/destroy.js:49:7
    at Socket._destroy (net.js:593:3)
    at Socket.destroy (internal/streams/destroy.js:37:8)
Emitted 'error' event at:
    at Connection.socketError (C:\work\GitRepos\tedious-test\node_modules\tedious\lib\connection.js:1187:12)
    at Socket.<anonymous> (C:\work\GitRepos\tedious-test\node_modules\tedious\lib\connection.js:1032:14)
    [... lines matching original stack trace ...]
    at Socket.destroy (internal/streams/destroy.js:37:8)
    at WriteWrap.onWriteComplete [as oncomplete] (internal/stream_base_commons.js:84:12) {
  message: 'Connection lost - write ECONNRESET',
  code: 'ESOCKET'

Tetapi jika meningkatkan ukuran paket menjadi 16384 tanpa set enkripsi, semuanya berfungsi dengan baik.

Omong-omong, saya menguji versi node: 12.4.0, 12.6.0. Hasil yang sama.

Mendapat Connection lost - read ECONNRESET saat menjalankan kueri panjang. Dengan encrypt: true dan packetSize: 32768 , semuanya berfungsi dengan baik.

versi simpul: v12.6.0

@wy193777 dapatkah Anda memeriksa apakah semuanya berfungsi tanpa opsi tambahan dan menggunakan versi simpul pada maks 12.3.1?

@susares node v12.3.1 berfungsi tanpa opsi packetSize berfungsi untuk saya.

versi simpul: v12.2.0 berfungsi tanpa opsi ukuran paket
versi simpul: v.12.6.0 mengharuskan saya menggunakan packetSize: 8192 untuk menghindari kesalahan Connection lost - read ECONNRESET

Ini sepertinya karena https://github.com/nodejs/node/pull/27861 . Entah bagaimana, SQLServer akan mengakhiri koneksi jika segmen TLS besar ditulis. Saya memiliki perbaikan dan akan segera membuka PR. 👍

Bagi mereka yang tidak sabar, inilah perbedaan yang akan memperbaikinya:

diff --git a/src/message-io.js b/src/message-io.js
index 90875f8..79f5da8 100644
--- a/src/message-io.js
+++ b/src/message-io.js
@@ -72,6 +72,8 @@ module.exports = class MessageIO extends EventEmitter {
       encrypted: duplexpair.socket2
     };

+    securePair.cleartext.setMaxSendFragment(this.outgoingMessageStream.packetSize);
+
     // If an error happens in the TLS layer, there is nothing we can do about it.
     // Forward the error to the socket so the connection gets properly cleaned up.
     securePair.cleartext.on('error', (err) => {

:tada: Masalah ini telah diselesaikan di versi 6.2.1 :tada:

Rilis tersedia di:

Bot pelepas semantik Anda :package::rocket:

Apakah halaman ini membantu?
0 / 5 - 0 peringkat