Tedious: خطأ اتصال ESOCKET من تطبيق الويب node js إلى اتصال قاعدة بيانات MSSql

تم إنشاؤها على ٢٥ سبتمبر ٢٠١٨  ·  19تعليقات  ·  مصدر: tediousjs/tedious

أهلا بالفريق،
حاليًا ، نحصل على مشكلات الاتصال المتقطع من تطبيق الويب الخاص بنا إلى MsSql بشكل متكرر عندما يكون هناك المزيد من حركة المرور إلى الخدمة.
هل هناك أي توصيات نهائية بشأن هذه المسألة.

خطأ :
_ {ConnectionError: فشل الاتصال بـ <>: 1433 - تعذر الاتصال (تسلسل)
على Connection.tedious.once.err (D: \ home \ site \ wwwroot \ node_modules \ mssql \ lib \ tedious.js: 216: 17)
في Connection.g (events.js: 291: 16)
في emitOne (events.js: 96: 13)
في Connection.emit (events.js: 188: 7)
في Connection.socketError (D: \ home \ site \ wwwroot \ node_modules \ tedious \ lib \ connection.js: 699: 14)
في D: \ home \ site \ wwwroot \ node_modules \ tedious \ lib \ connection.js: 590: 25
في SequentialConnectionStrategy.connect (D: \ home \ site \ wwwroot \ node_modules \ tedious \ lib \ connector.js: 153: 9)
في Socket.onError (D: \ home \ site \ wwwroot \ node_modules \ tedious \ lib \ connector.js: 169: 16)
في emitOne (events.js: 96: 13)
في Socket.emit (events.js: 188: 7)
الكود: "ESOCKET" ،
originalError: _

تفاصيل الإصدار:
"مملة": "2.0.1"،
"mssql": "^ 4.0.4"،

شكرا،
برافين.

التعليق الأكثر فائدة

حصلت على نفس الخطأ عند استخدام رمز منسوخ من نموذج Microsoft الرسمي: https://www.microsoft.com/en-us/sql-server/developer-get-started/node/windows/step/2.html

أخيرًا ، قمت بحل هذا الخطأ عن طريق تمكين بروتوكول TCP / IP في "Sql Server Configuration Manager" -> "SQL Server Network Configuration" -> "Protocols for"->" TCP / IP "

C:\Users\zpc\Desktop\SqlServerSample>node connect.js { ConnectionError: Failed to connect to localhost:1433 - Could not connect (sequence) at ConnectionError (C:\Users\zpc\Desktop\SqlServerSample\node_modules\tedious\lib\errors.js:13:12) at Connection.socketError (C:\Users\zpc\Desktop\SqlServerSample\node_modules\tedious\lib\connection.js:1183:28) at Connector.execute (C:\Users\zpc\Desktop\SqlServerSample\node_modules\tedious\lib\connection.js:1022:21) at SequentialConnectionStrategy.connect (C:\Users\zpc\Desktop\SqlServerSample\node_modules\tedious\lib\connector.js:69:7) at Socket.onError (C:\Users\zpc\Desktop\SqlServerSample\node_modules\tedious\lib\connector.js:84:12) at Socket.emit (events.js:189: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) message: 'Failed to connect to localhost:1433 - Could not connect (sequence)', code: 'ESOCKET' }

ال 19 كومينتر

يا @ Praveen335 👋🏻

يؤسفني معرفة أنك تواجه هذه المشكلة عند استخدام tedious . لسوء الحظ ، المعلومات التي قدمتها ليست كافية بالنسبة لنا لفهم ما يحدث. هل يمكنك تقديم المزيد من المعلومات؟ على سبيل المثال ، سيكون من المفيد لنا أن نعرف:

  • أي إصدار من tedious تستخدمه بالضبط؟
  • متى يحدث هذا الخطأ بالضبط؟ من تتبع المكدس ، يبدو أن هذا يحدث عند الاتصال بقاعدة البيانات ، ولكن هل يمكن للعمليات الأخرى الاستمرار في الاتصال في نفس الوقت؟ أعتقد أن هذا قد يكون مشكلة في SQLServer (ربما بسبب الحمل الكبير الذي ذكرته) وليست مشكلة مع tedious نفسها.

شكرا! 🙇🏻‍♂️

مرحبًا arthurschreiber ،
شكرا لردكم السريع. لقد قمت بالفعل بتحديث النسخة المملة في رسالتي.

تفاصيل الإصدار:
"مملة": "2.0.1"،
"mssql": "^ 4.0.4"،

لقد ألقينا نظرة على مؤشر ترابط العمل النشط لخادم SQL واتصال الشبكة من خلال رفعه إلى دعم Microsoft. ذكروا كل خير من نهاية SQLServer. نسبة مؤشر ترابط العمل أيضا أقل. لقد حاولت إعادة المحاولة باستخدام منطق مخصص. لكن لا حظ. بعد الحصول على خطأ في المقبس ، يتم طرح جميع الطلبات اللاحقة باستمرار. أي اقتراح أو توصية ستساعدنا حقًا. حاليًا ، نحن نستخدم تجمع الاتصال للاتصال بقاعدة البيانات.

شكرا،
برافين.

نفس الشيء هنا ، يصل فجأة إلى تلك الحالة ويتعثر ...

نشهد أيضًا حدوث نفس أخطاء الاتصال على نظامنا.

نحن نقوم بتوصيل connectPool عند بدء الخدمة.
new App.SQL.ConnectionPool

في لحظة عشوائية يفشل الطلب مع:

خطأ في الاتصال: فشل الاتصال بخادم قاعدة البيانات : 1433 - تعذر الاتصال (تسلسل)

تتم إعادة تشغيل الخدمة تلقائيًا ولكنها تستمر في طرح هذه الأخطاء لمدة 20 دقيقة تقريبًا. بعد إعادة تشغيل هذه الخدمة ويمكن الاتصال مرة أخرى.

نحن نشهد هذا من خلال عمليات متعددة للعقد على هذا الخادم ولكنها لا تنخفض في وقت واحد (في بعض الأحيان تفعل ذلك) ، وهو أمر غريب نوعًا ما. نعتقد أن السبب في تطبيق NodeJS وليس في mssql DB.

نحن نستخدم هذه الإصدارات:

mssql: 4.3.0 (الأحدث)
النسخة المملة المضمنة في هذه الحزمة هي 2.7.1.

مرحبا. نحن أيضا نواجه هذه المشكلة.

هذه هي إصداراتنا:
mssql: 4.3.0
الذي يستخدم نسخة مملة: 2.7.1

ConnectionError: Failed to connect to xxxxxx.database.windows.net:1433 in 15000ms
at Connection.tedious.once.err (...node_modules\mssql\lib\tedious.js:239:17)
at Object.onceWrapper (events.js:315:30)
at emitOne (events.js:116:13)
at Connection.emit (events.js:211:7)
at Connection.connectTimeout (...node_modules\mssql\node_modules\tedious\lib\connection.js:944:12)
at Timeout._onTimeout (...node_modules\mssql\node_modules\tedious\lib\connection.js:913:16)
at ontimeout (timers.js:482:11)
at tryOnTimeout (timers.js:317:5)
at Timer.listOnTimeout (timers.js:277:5)

اكتب إصدارات MSSQL Server الخاصة بك. الآن ، تم استبدال SQLNCLI11 بـ MSOLEDBSQL لمثيل MSSQL2017.
https://blogs.msdn.microsoft.com/sqlnativeclient/2018/03/30/released-microsoft-ole-db-driver-for-sql-server/

حصلت على نفس الخطأ عند استخدام رمز منسوخ من نموذج Microsoft الرسمي: https://www.microsoft.com/en-us/sql-server/developer-get-started/node/windows/step/2.html

أخيرًا ، قمت بحل هذا الخطأ عن طريق تمكين بروتوكول TCP / IP في "Sql Server Configuration Manager" -> "SQL Server Network Configuration" -> "Protocols for"->" TCP / IP "

C:\Users\zpc\Desktop\SqlServerSample>node connect.js { ConnectionError: Failed to connect to localhost:1433 - Could not connect (sequence) at ConnectionError (C:\Users\zpc\Desktop\SqlServerSample\node_modules\tedious\lib\errors.js:13:12) at Connection.socketError (C:\Users\zpc\Desktop\SqlServerSample\node_modules\tedious\lib\connection.js:1183:28) at Connector.execute (C:\Users\zpc\Desktop\SqlServerSample\node_modules\tedious\lib\connection.js:1022:21) at SequentialConnectionStrategy.connect (C:\Users\zpc\Desktop\SqlServerSample\node_modules\tedious\lib\connector.js:69:7) at Socket.onError (C:\Users\zpc\Desktop\SqlServerSample\node_modules\tedious\lib\connector.js:84:12) at Socket.emit (events.js:189: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) message: 'Failed to connect to localhost:1433 - Could not connect (sequence)', code: 'ESOCKET' }

حصلت على نفس الخطأ عند استخدام رمز منسوخ من نموذج Microsoft الرسمي: https://www.microsoft.com/en-us/sql-server/developer-get-started/node/windows/step/2.html

أخيرًا ، قمت بحل هذا الخطأ عن طريق تمكين بروتوكول TCP / IP في "Sql Server Configuration Manager" -> "SQL Server Network Configuration" -> "Protocols for" -> "TCP / IP"

C:\Users\zpc\Desktop\SqlServerSample>node connect.js { ConnectionError: Failed to connect to localhost:1433 - Could not connect (sequence) at ConnectionError (C:\Users\zpc\Desktop\SqlServerSample\node_modules\tedious\lib\errors.js:13:12) at Connection.socketError (C:\Users\zpc\Desktop\SqlServerSample\node_modules\tedious\lib\connection.js:1183:28) at Connector.execute (C:\Users\zpc\Desktop\SqlServerSample\node_modules\tedious\lib\connection.js:1022:21) at SequentialConnectionStrategy.connect (C:\Users\zpc\Desktop\SqlServerSample\node_modules\tedious\lib\connector.js:69:7) at Socket.onError (C:\Users\zpc\Desktop\SqlServerSample\node_modules\tedious\lib\connector.js:84:12) at Socket.emit (events.js:189: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) message: 'Failed to connect to localhost:1433 - Could not connect (sequence)', code: 'ESOCKET' }

شكرا لك! كنت أواجه هذه المشكلة بالضبط ؛)

نظرًا لأننا ما زلنا نواجه هذه المشكلة مع جميع خدمات nodejs الخاصة بنا تقريبًا ، فقد أجرينا بعض الاختبارات الإضافية.
التعليق أعلاه الخاص بإصلاح TCP / IP ممكّن بالفعل على خادم sql الخاص بنا.

لقد أنشأنا خدمة nodejs جديدة لا تفعل شيئًا على الإطلاق. لم يتم استدعاؤه من قبل خدمة أخرى ، يتم تشغيله فقط في PM2.
سيفتح مجموعة اتصال جديدة عندما يبدأ ويجلس هناك.

حصلنا على 3 أخطاء في 5 أيام ، تحدث بشكل عشوائي:
"خطأ في الاتصال: فشل الاتصال بـ sql.tilroy. داخلي: 1433 - تعذر الاتصال (تسلسل)".

هذا هو الكود:

"
تكوين const = {
المستخدم: Config.sql.sqluser ،
كلمة المرور: Config.sql.sqlpassword ،
الخادم: Config.sql.sqlhost ،
قاعدة البيانات: Config.sql.sqldatabase ،
المنفذ: Config.sql.sqlport ،
ConnectionTimeout: 3000 ،
طلب المهلة: 3000 ،
حوض السباحة: {
الحد الأقصى: 100 ،
min: 1 ، // لا تغلق جميع الاتصالات.
الخمول مهلة ميليس: 1000 ،
الإخلاء: RunIntervalMillis: 1500000
}
} ؛

const sqlConnection = new SQL.ConnectionPool(config, function (err) {
    Log.debug("got sql connection");
    if(err){
        Log.error(err);
        process.exit(1);
    }
});

sqlConnection.on('error', err => {
    Log.error(`Connection err : ${err}`);
    process.exit(1);
});

"

قمنا بترقية خادم SQL الخاص بنا ولكن ذلك لم يساعد. تم تحديث جميع حزمنا ولكن لا تزال هناك هذه الأخطاء.
أي شيء آخر يمكننا تجربته؟ نفضل عدم التخلص من mssql المملة لأننا نستخدمها في الكثير من الخدمات.

TimTilroy هل تستخدم مملة للتعامل مع تجمع الاتصال الخاص بك أو مملة اتصال بركة ؟ إذا كنت تستخدم المشروع الممل ، فربما يمكنك تجربة مجموعة الاتصال المملة ومعرفة ما إذا كان ذلك يساعدك.

مرحبًا IanChokS ،

نحن لا نستخدم حزمة اتصال تجمع مملة ، ولكن ConnectionPool الافتراضية لحزمة mssql (إنها مملّة على ما أعتقد).

ومع ذلك ، قمنا بتحديث حزمة mssql إلى الإصدار 5.1 الآن ويبدو أنها مستقرة ، ولم يعد لدينا المزيد من أخطاء الاتصال في خدمة الاختبار الخاصة بنا. أحد التغييرات هو ما يلي:

مكتبة التجمع المنقولة من تجمع العقدة إلى tarn.js

لذلك ربما حل هذا مشكلتنا.

قمنا أيضًا بتعيين اتصالات min pool على 0 ، لا نعرف ما إذا كان ذلك يمكن أن يكون له أي تأثير.

MarioPerezEsteso إذا كنت تواجه مشكلة في الاتصال بالخادم الخاص بك ، يمكنك محاولة التأكد من تمكين TCP IP وأن لديك رقم المنفذ الصحيح في التكوين الخاص بك للتحقق مما إذا كان يمكن الوصول إلى الخادم.

regevbr ، @ Praveen335 إذا كنت تستخدم تجميع الاتصالات ، يمكنك محاولة استخدام مكتبة tarn.js بدلاً من تجمع العقدة مثل ما فعله TimTilroy لمعرفة ما إذا كان يعمل على إصلاح مشكلات الاتصال لديك. إذا لم يكن الأمر كذلك ، فربما حاول الترقية إلى أحدث إصدار من mssql (v5.1).

تحديث: لقد طبقنا الإصدار الجديد من mssql (5.1.0) على جميع خدمات sql الخاصة بنا ، وقمنا بتحديث اتصالات min pool إلى 0 ويبدو أن أخطاء الاتصال توقفت منذ نشرنا.

أعتقد أن المشكلة هي فقط لأنك تستخدم "/" بدلاً من "\" في الاسم أو شيء من هذا القبيل

@ Praveen335 هل حاولت الترقية إلى الإصدار الجديد من mssql (5.1.0) لمعرفة ما إذا كان يحل مشكلتك؟ إذا لم يكن كذلك ، فلا تتردد في إعادة فتح هذه المشكلة.

أنا أستخدم الإصدارات:
mssql: "^ 6.2.0" ،
ممل: "^ 8.3.0"

لقد قمت بتمكين TCP / IP في مدير التكوين. كما تعمل جميع خدمات SQL الخاصة بي. حتى الآن أتلقى الخطأ التالي:

C: \ Nodejs \ node-sql-conn \ Database> node connect.js
مملة مهملة في الإصدار الرئيسي التالي من tedious ، لن يؤدي إنشاء مثيل Connection جديد بعد الآن إلى إنشاء اتصال بالخادم تلقائيًا. الرجاء استخدام الوظيفة المساعدة الجديدة connect أو استدعاء طريقة .connect على كائن Connection الذي تم إنشاؤه حديثًا لإسكات هذه الرسالة. داخلي \ عملية \ task_queues.js: 79: 11
فشل الاتصال

C: \ Nodejs \ node-sql-conn \ Databaseconnect.js: 26
رمي يخطئ
^
خطأ في الاتصال: فشل الاتصال بالمضيف المحلي: غير محدد - لا يمكن الاتصال بالكتابة بعد إتلاف الدفق
في ConnectionError (C: \ Nodejs \ node-sql-conn \ node_modulestedious \ lib \ errors.js: 13: 12)
في Connection.socketError (C: \ Nodejs \ node-sql-conn \ node_modulestedious \ libconnection.js: 1308: 56)
في المقبس.(C: \ Nodejs \ node-sql-conn \ node_modulestedious \ libconnection.js: 1143: 14)
في Socket.emit (events.js: 327: 22)
عن طريق الخطأ OrDestroy (داخلي / تيارات / إتلاف.جس: 108: 12)
في onwriteError (_stream_writable.js: 418: 5)
في onwrite (_stream_writable.js: 445: 5)
في doWrite (_stream_writable.js: 399: 11)
في writeOrBuffer (_stream_writable.js: 387: 5)
في Socket.Writable.write (_stream_writable.js: 318: 11) {
الكود: "ESOCKET"
}

هذا هو الكود الخاص بي:
فار اتصال = يتطلب ("مملة").
فار التكوين = {
الخادم: "localhost" ،
المصادقة: {
اكتب: "افتراضي" ،
والخيارات: {
اسم المستخدم: 'sa' ،
كلمه السر: '####'،
المنفذ: 1433
}
} ،
والخيارات: {
قاعدة البيانات: "الشركة" ،
اسم المثيل: "MSSQLSERVER" ،
rowCollectionOnDone: صحيح ،
useColumnNames: خطأ ،
trustServerCertificate: خطأ
}
} ؛
var connect = اتصال جديد (config) ؛
connect.on (اتصال ، وظيفة (يخطئ) {
إذا (يخطئ) {
console.log ("فشل الاتصال") ؛
رمي يخطئ
}
آخر{
console.log ('متصل') ؛
}
}) ؛
module.exports = اتصال ؛

حصلت على نفس الخطأ عند استخدام رمز منسوخ من نموذج Microsoft الرسمي: https://www.microsoft.com/en-us/sql-server/developer-get-started/node/windows/step/2.html

أخيرًا ، قمت بحل هذا الخطأ عن طريق تمكين بروتوكول TCP / IP في "Sql Server Configuration Manager" -> "SQL Server Network Configuration" -> "Protocols for" -> "TCP / IP"
SQLServerConfigurationManager

C:\Users\zpc\Desktop\SqlServerSample>node connect.js { ConnectionError: Failed to connect to localhost:1433 - Could not connect (sequence) at ConnectionError (C:\Users\zpc\Desktop\SqlServerSample\node_modules\tedious\lib\errors.js:13:12) at Connection.socketError (C:\Users\zpc\Desktop\SqlServerSample\node_modules\tedious\lib\connection.js:1183:28) at Connector.execute (C:\Users\zpc\Desktop\SqlServerSample\node_modules\tedious\lib\connection.js:1022:21) at SequentialConnectionStrategy.connect (C:\Users\zpc\Desktop\SqlServerSample\node_modules\tedious\lib\connector.js:69:7) at Socket.onError (C:\Users\zpc\Desktop\SqlServerSample\node_modules\tedious\lib\connector.js:84:12) at Socket.emit (events.js:189: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) message: 'Failed to connect to localhost:1433 - Could not connect (sequence)', code: 'ESOCKET' }

هذا واحد يعمل لأجلي. شكرا لك على اعطائي الحل.

أقوم أيضًا بتجربة أخطاء اتصال ESOCKET هذه ، ولا تتعلق المشكلة بـ TCP / IP نظرًا لأن التطبيق متصل من AWS EC2 إلى AS RDS ويعمل معظم الوقت.

أخيرًا لقد قمت بحل الخطأ. النص الذي كنت أستخدمه في كل مرة طلبت فيها اتصالاً جديدًا:

function getConnection () {
    // console.log("config")
    // console.log(config)
    return new Promise(function (resolve, reject) {
        const pool = new sql.ConnectionPool(getConfig())
        // console.log("Getting connection...");
        pool.connect()
        .then((cn) => {
            // console.log("connection got");
            resolve(cn);
        })
        .catch((e) => {
            // console.log("connection not got");
            reject(e);
        });
    })
}

النص الذي حل المشكلة:

function runCommand(cmdText) {
    return new Promise((resolve, reject) => {
        pool2Connect
        .then((pool) => {
            // pool.request() // or: new sql.Request(pool2)
            // .input('input_parameter', sql.Int, 10)
            // .output('output_parameter', sql.VarChar(50))
            // .execute('procedure_name', (err, result) => {
            //     // ... error checks
            //     console.dir(result)
            // })
            pool.request() // or: new sql.Request(pool2)
            .query(cmdText)
            .then((rows) => {
                return resolve(rows.recordset);
            })
            .catch((e) => {
                return reject(e);
            });
        })
        .catch((err) => {
            return reject(err);
        });
    });
}

حيث يجب تحديد pool2Connect مبدئيًا ، عند بدء البرنامج النصي:

    pool2 = new sql.ConnectionPool(config);
    pool2Connect = pool2.connect();
    pool2.on('error', err => {
        console.log(err);
    });

آمل أن يساعد

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات