Tedious: рдХрдиреЗрдХреНрд╢рди рддреНрд░реБрдЯрд┐: рдХрдиреЗрдХреНрд╢рди рдЦреЛ рдЧрдпрд╛ - рд▓рдВрдмреА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдбрд╛рд▓рдиреЗ рдкрд░ ECONNRESET рд▓рд┐рдЦреЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 16 рдЬреБрд▓ре░ 2019  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: tediousjs/tedious

рдореЗрд░реЗ рдкрд╛рд╕ Azure SQL рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ рдПрдХ рдЯреЗрдмрд▓ рд╣реИред

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

рдореИрдВрдиреЗ рд╕рд┐рдЧреНрдиреЗрдЪрд░ рдХреЙрд▓рдо рдореЗрдВ рдмрд╣реБрдд рд▓рдВрдмреА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдбрд╛рд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рдпрджрд┐ рдкреИрдХреЗрдЯ рдЖрдХрд╛рд░ 16384 рдпрд╛ рдЙрдЪреНрдЪрддрд░ рдкрд░ рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдореБрдЭреЗ рдирд┐рдореНрди рдЕрдкрд╡рд╛рдж рдорд┐рд▓рд╛:

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'
}

рдиреАрдЪреЗ рдореЗрд░рд╛ рд╕рд░рд▓ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИред рдореИрдВ рдирд╡реАрдирддрдо рдердХрд╛рдК рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд░реАрдб рдСрдкрд░реЗрд╢рди рд▓рдВрдмреА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдЪрд╛рд╣реЗ рдкреИрдХреЗрдЯ рдХрд╛ рдЖрдХрд╛рд░ рдХреБрдЫ рднреА рд╣реЛред рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рдореИрдВрдиреЗ рдХреНрдпрд╛ рдЧрд▓рдд рдХрд┐рдпрд╛?

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);
}

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдПрдХ рд▓рдВрдмреА рдХреНрд╡реЗрд░реА рдЪрд▓рд╛рдиреЗ рдкрд░ Connection lost - read ECONNRESET рдорд┐рд▓рд╛ред encrypt: true рдФрд░ packetSize: 32768 рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдиреЛрдб рд╕рдВрд╕реНрдХрд░рдг: v12.6.0

рд╕рднреА 9 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╣рдо рдЗрд╕реА рддрд░рд╣ рдХреЗ рдореБрджреНрджреЗ рдореЗрдВ рднрд╛рдЧ рд▓реЗрддреЗ рд╣реИрдВред рдПрдХ рд▓рдВрдмреА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдбрд╛рд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордпред рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рдж рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдпрд╣ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдбреЙрдХ рдХрд┐рдП рдЧрдП рдиреЛрдбрдЬ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред
рдиреЛрдб:10-рд╕реНрд▓рд┐рдо -> рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
рдиреЛрдб: 12.3.1 -> рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдиреЛрдб: 12.4 рдкрд░рд┐рдгрд╛рдо рдпрд╛ рддреЛ рд╕реЙрдХреЗрдЯ рд╣реИрдВрдЧрдЕрдк рдпрд╛ рд╕реЙрдХреЗрдЯ рдмрдВрдж рддреНрд░реБрдЯрд┐ рдореЗрдВред

рд╣рд╛рдп @ricklang , рдореИрдВ рдЗрд╕реЗ рджреЗрдЦ рд░рд╣рд╛ рдерд╛ред рдХреНрдпрд╛ "рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ: рдЯреНрд░реВ" рдЖрдкрдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдПрдХ рдЖрд╡рд╢реНрдпрдХ рд╕реЗрдЯрд┐рдВрдЧ рд╣реИ? рдпрджрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕реЗ рдЧрд▓рдд рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВ рдпрд╛ рдЗрд╕реЗ рдЙрд╕ рд╡рд┐рдХрд▓реНрдк рдореЗрдВ рд╕реЗрдЯ рди рдХрд░реЗрдВ рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ -false рдЗрди рдореБрджреНрджреЛрдВ рдХреЛ рднреА рд╣рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЗрд╕рдХрд╛ рдореВрд▓ рдХрд╛рд░рдг рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИред рдореИрдВрдиреЗ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдЧреИрд░-рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрдиреЗрдХреНрд╢рди рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдкреИрдХреЗрдЯ рдХреА рдЬрд╛рдВрдЪ рдХреА, рдкреИрдХреЗрдЯ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрдм рдИрдУрдПрдо рдХреЗ рд╕рд╛рде рдЕрдВрддрд┐рдо рдкреИрдХреЗрдЯ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдХрдиреЗрдХреНрд╢рди рдЦреЛ рдЧрдпрд╛ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИред рдореИрдВ рдереЛрдбрд╝реА рдФрд░ рдЬрд╛рдВрдЪ рджреВрдВрдЧрд╛, рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдореИрдВ рдХреБрдЫ рдЦреЛрдж рд╕рдХрддрд╛ рд╣реВрдВред
рджреВрд╕рд░реА рдУрд░, рд╣рдо рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ @arthurschreiber рд╕реЗ рднреА рдкреВрдЫ рд╕рдХрддреЗ рд╣реИрдВ, рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЙрд╕рдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ рд╣реИред

рд╕рд╛рде

encrypt: false,

рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рд╣реИ (рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдкреИрдХреЗрдЯ рдХрд╛ рдЖрдХрд╛рд░ рдХреНрдпрд╛ рд╣реИ):

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'

рдпрджрд┐ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗрдЯрд┐рдВрдЧ рд╣рдЯрд╛ рджреЗрдВ, рд▓реЗрдХрд┐рди рдкреИрдХреЗрдЯ рдХрд╛ рдЖрдХрд╛рд░ 4096 рдкрд░ рдЫреЛрдбрд╝ рджреЗрдВ, рддреЛ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рд╣реИ:

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'

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдмрд┐рдирд╛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗрдЯ рдХреЗ рдкреИрдХреЗрдЯ рдХрд╛ рдЖрдХрд╛рд░ рдмрдврд╝рд╛рдХрд░ 16384 рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдП, рддреЛ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рд╡реИрд╕реЗ, рдореИрдВрдиреЗ рдиреЛрдб рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛: 12.4.0, 12.6.0ред рд╡рд╣реА рдкрд░рд┐рдгрд╛рдоред

рдПрдХ рд▓рдВрдмреА рдХреНрд╡реЗрд░реА рдЪрд▓рд╛рдиреЗ рдкрд░ Connection lost - read ECONNRESET рдорд┐рд▓рд╛ред encrypt: true рдФрд░ packetSize: 32768 рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдиреЛрдб рд╕рдВрд╕реНрдХрд░рдг: v12.6.0

@ wy193777 рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдзрд┐рдХрддрдо 12.3.1 рдкрд░ рдиреЛрдб рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ?

@susares рдиреЛрдб v12.3.1 рдмрд┐рдирд╛ рдкреИрдХреЗрдЯ рдЖрдХрд╛рд░ рдХреЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд╡рд┐рдХрд▓реНрдк рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдиреЛрдб рд╕рдВрд╕реНрдХрд░рдг: v12.2.0 рдмрд┐рдирд╛ рдкреИрдХреЗрдЯ рдЖрдХрд╛рд░ рд╡рд┐рдХрд▓реНрдк рдХреЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
рдиреЛрдб рд╕рдВрд╕реНрдХрд░рдг: v.12.6.0 рдиреЗ рдореБрдЭреЗ packetSize: 8192 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ Connection lost - read ECONNRESET рддреНрд░реБрдЯрд┐ рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХреЗ

рдпрд╣ https://github.com/nodejs/node/pull/27861 рдХреЗ рдХрд╛рд░рдг рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред рдмрдбрд╝реЗ рдЯреАрдПрд▓рдПрд╕ рд╕реЗрдЧрдореЗрдВрдЯ рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рдкрд░ рдХрд┐рд╕реА рднреА рддрд░рд╣, SQLServer рдХрдиреЗрдХреНрд╢рди рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрдЧрд╛ред рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдлрд┐рдХреНрд╕ рд╣реИ рдФрд░ рд╢реАрдШреНрд░ рд╣реА рдПрдХ рдкреАрдЖрд░ рдЦреЛрд▓реВрдВрдЧрд╛ред рдореИрдВ

рдЬреЛ рд▓реЛрдЧ рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдЙрдирдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдВрддрд░ рд╣реИ рдЬреЛ рдЗрд╕реЗ рдареАрдХ рдХрд░ рджреЗрдЧрд╛:

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: рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╕рдВрд╕реНрдХрд░рдг 6.2.1 рдореЗрдВ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ :tada:

рд░рд┐рд▓реАрдЬ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ:

рдЖрдкрдХрд╛ рд╕рд┐рдореЗрдВрдЯрд┐рдХ-рд░рд┐рд▓реАрдЬрд╝ рдмреЙрдЯ :package::rocket:

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

aniltomar10 picture aniltomar10  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

tvrprasad picture tvrprasad  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

David-Engel picture David-Engel  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ggazulla picture ggazulla  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

yianni-ververis picture yianni-ververis  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ