【问题标题】:Sequelize/tedious create/update records with long string error: read ECONNRESETSequelize/乏味的创建/更新带有长字符串错误的记录:读取 ECONNRESET
【发布时间】:2019-11-23 17:46:48
【问题描述】:

我正在尝试使用 sequelize/tedious 通过 CRUD 操作访问 Azure SQL 数据库。我在其中一张表中有一个长字符串(签名)。

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

这是我的续集模型:

/* owner.js */
export default function(sequelize, DataTypes) {
  var Owner = sequelize.define(
    'Owner',
    {
      ownerId: {
        type: DataTypes.INTEGER,
        primaryKey: true,
        autoIncrement: true,
        allowNull: false,
        field: 'OwnerId',
      },
      name: {
        type: DataTypes.STRING(50),
        validate: {
          notEmpty: true,
        },
        allowNull: false,
        field: 'Name',
      },
      signature: {
        type: DataTypes.STRING(50000),
        validate: {
          notEmpty: true,
        },
        allowNull: true,
        field: 'Signature',
      },
    },
    {
      schema: 'dbo',
      timestamps: false,
      freezeTableName: true,
    }
  );

  return Owner;
}

这里是读取和创建记录的代码:

/* index.js */
import Sequelize from 'sequelize';

var db = {};

var sequelize = new Sequelize('mydb', 'developer', 'mypassword', {
  host: 'mydevserver.database.windows.net',
  dialect: 'mssql',
  pool: {
    max: 5,
    min: 0,
    idle: 10000
  },
  dialectOptions: {
    options: {
      encrypt: true
    }
  }
});


db.sequelize = sequelize;
db.Sequelize = Sequelize;

var model = sequelize['import']('./owner.js');
db[model.name] = model;

/* Find a record with long signature (8000 chars) is fine. */
db.Owner.findByPk(6)
.then(o => {
  console.log(`Found owner ${o.name}, with signature ${o.signature}.`);
})

// let s = '0123456789'.repeat(100); /* This is ok. Record created. */
let s = '0123456789'.repeat(500); /* This gives error 'read ECONNRESET' */

db.Owner.create({  
  name: 'Rick',
  signature: `${s}`
})
.then(newOwner => {
  console.log(`New owner ${newOwner.name}, with id ${newOwner.ownerId} has been created.`);
}).catch(function (error) {
  console.log(error.message);
});

我正在使用

  "sequelize": "^5.10.1",
  "tedious": "^6.2.0"

我知道你可以输入的字符串会有限制,但是 5000 个字符的字符串不会那么长。

知道有什么问题吗?这是错误的堆栈跟踪

Unhandled rejection SequelizeDatabaseError: read ECONNRESET
    at Query.formatError (C:\work\GitRepos\sequelize-test\node_modules\sequelize\lib\dialects\mssql\query.js:309:12)
    at Request.userCallback (C:\work\GitRepos\sequelize-test\node_modules\sequelize\lib\dialects\mssql\query.js:69:23)
    at Request.callback (C:\work\GitRepos\sequelize-test\node_modules\tedious\lib\request.js:37:27)
    at Connection.socketError (C:\work\GitRepos\sequelize-test\node_modules\tedious\lib\connection.js:2157:20)
    at Connection.dispatchEvent (C:\work\GitRepos\sequelize-test\node_modules\tedious\lib\connection.js:1172:36)
    at Connection.socketError (C:\work\GitRepos\sequelize-test\node_modules\tedious\lib\connection.js:1190:10)
    at Socket.<anonymous> (C:\work\GitRepos\sequelize-test\node_modules\tedious\lib\connection.js:1032:14)
    at Socket.emit (events.js:205:15)
    at Socket.EventEmitter.emit (domain.js:471:20)
    at emitErrorNT (internal/streams/destroy.js:91:8)
    at emitErrorAndCloseNT (internal/streams/destroy.js:59:3)
    at processTicksAndRejections (internal/process/task_queues.js:84:9)

更新:

如果我增加连接的数据包大小,

dialectOptions: {
    options: {
      encrypt: true,
      packetSize: 32768
    }
  }

那么问题就解决了。即使我将字符串的长度增加到更大的数字,例如

let s = '0123456789'.repeat(500000);

它仍然有效。这对我来说没有意义。在服务器端,为什么当数据包大小为 4096(默认)时没有重新组装数据包,但是在更大的数据包大小时,数据包被重新组装。同样在客户端,无论数据包大小如何,数据包总是会重新组合。


【问题讨论】:

    标签: node.js sql-server sequelize.js tedious


    【解决方案1】:

    看起来这是 Tedious 中的 bug,已在 6.2.1 中修复。当我将 Azure 中的 NodeJS 应用程序切换为使用 NodeJS 12 时,我遇到了它。

    上面提到的关于增加数据包大小的解决方法确实有效,这就是我实现的,因为我使用的是 Sequelize 4,我不确定当前版本的 Tedious 是否兼容(我似​​乎记得在某处阅读过您需要某个版本才能让 Sequelize 4 开心)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多