From 6b705c131bacbccaa737a0a15462dce36469d320 Mon Sep 17 00:00:00 2001 From: Angel Svirkov Date: Fri, 22 Oct 2021 15:05:58 +0200 Subject: [PATCH 1/3] fix connection.query signature form - Issue: Calling `connection.query` with an options object fails after a connection has been upgraded #59 --- example.js | 1 + package-lock.json | 71 +--------------------------- package.json | 2 +- utilities.js | 117 +++++++++++++++++++++++++++------------------- 4 files changed, 74 insertions(+), 117 deletions(-) diff --git a/example.js b/example.js index f82d1fb..b42f5ff 100644 --- a/example.js +++ b/example.js @@ -1,5 +1,6 @@ 'use strict'; +/* eslint-disable import/no-unresolved */ const mysql = require('mysql'); const mysqlUtilities = require('./utilities'); diff --git a/package-lock.json b/package-lock.json index feb28eb..d71e25d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -173,11 +173,6 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, - "bignumber.js": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", - "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==" - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -276,11 +271,6 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -853,7 +843,8 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true }, "is-arrayish": { "version": "0.2.1", @@ -955,11 +946,6 @@ "has-symbols": "^1.0.2" } }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -1089,17 +1075,6 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "mysql": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", - "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==", - "requires": { - "bignumber.js": "9.0.0", - "readable-stream": "2.3.7", - "safe-buffer": "5.1.2", - "sqlstring": "2.3.1" - } - }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -1305,11 +1280,6 @@ "fast-diff": "^1.1.2" } }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -1343,20 +1313,6 @@ "read-pkg": "^3.0.0" } }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, "regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", @@ -1394,11 +1350,6 @@ "glob": "^7.1.3" } }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, "semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -1498,11 +1449,6 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "sqlstring": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", - "integrity": "sha1-R1OT/56RR5rqYtyvDKPRSYOn+0A=" - }, "string-width": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", @@ -1534,14 +1480,6 @@ "define-properties": "^1.1.3" } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", @@ -1659,11 +1597,6 @@ "punycode": "^2.1.0" } }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, "v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", diff --git a/package.json b/package.json index f1b1fef..e2b2845 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "engines": { "node": ">= 6.0.0" }, - "dependencies": { + "peerDependencies": { "mysql": "^2.18.1" }, "devDependencies": { diff --git a/utilities.js b/utilities.js index 9a836b1..ea561ef 100644 --- a/utilities.js +++ b/utilities.js @@ -1,5 +1,9 @@ 'use strict'; +/* eslint-disable no-use-before-define */ +/* eslint-disable import/no-unresolved */ +const { createQuery } = require('mysql'); + const identifierRegexp = /^[0-9,a-z,A-Z_.]*$/; const escapeIdentifier = (str, quote) => { @@ -51,20 +55,24 @@ const upgrade = connection => { values, callback ) { + const queryOptions = createQuery(sql, values, callback); + const userCallback = queryOptions._callback; + const startTime = new Date().getTime(); - if (typeof values === 'function') { - callback = values; - values = []; - } - const query = this.inherited(sql, values, (err, res, fields) => { + + const callbackWrapper = (err, res, fields) => { const endTime = new Date().getTime(); const executionTime = endTime - startTime; connection.emit('query', err, res, fields, query); if (connection.slowTime && executionTime >= connection.slowTime) { connection.emit('slow', err, res, fields, query, executionTime); } - if (callback) callback(err, res, fields); - }); + if (userCallback) userCallback(err, res, fields); + }; + + queryOptions._callback = callbackWrapper; + + const query = this.inherited(queryOptions); return query; }); @@ -120,40 +128,45 @@ const upgrade = connection => { // Returns single row as associative array of fields // connection.queryRow = function (sql, values, callback) { - if (typeof values === 'function') { - callback = values; - values = []; - } - return this.query(sql, values, (err, res, fields) => { - if (err) return callback(err); + const queryOptions = createQuery(sql, values, callback); + const userCallback = queryOptions._callback; + + const callbackWrapper = (err, res, fields) => { + if (err) return userCallback(err); res = res[0] ? res[0] : false; - callback(err, res, fields); - }); + userCallback(err, res, fields); + }; + + queryOptions._callback = callbackWrapper; + + return this.query(queryOptions); }; // Returns single value (scalar) // connection.queryValue = function (sql, values, callback) { - if (typeof values === 'function') { - callback = values; - values = []; - } - return this.queryRow(sql, values, (err, res, fields) => { - if (err) return callback(err); + const queryOptions = createQuery(sql, values, callback); + const userCallback = queryOptions._callback; + + const callbackWrapper = (err, res, fields) => { + if (err) return userCallback(err); const value = res[Object.keys(res)[0]]; - callback(err, value, fields); - }); + userCallback(err, value, fields); + }; + + queryOptions._callback = callbackWrapper; + + return this.queryRow(queryOptions); }; // Query returning array of column field values // connection.queryCol = function (sql, values, callback) { - if (typeof values === 'function') { - callback = values; - values = []; - } - return this.query(sql, values, (err, res, fields) => { - if (err) return callback(err); + const queryOptions = createQuery(sql, values, callback); + const userCallback = queryOptions._callback; + + const callbackWrapper = (err, res, fields) => { + if (err) return userCallback(err); const result = []; let i, row, keys; for (i in res) { @@ -161,19 +174,22 @@ const upgrade = connection => { keys = Object.keys(row); result.push(row[keys[0]]); } - callback(err, result, fields); - }); + userCallback(err, result, fields); + }; + + queryOptions._callback = callbackWrapper; + + return this.query(queryOptions); }; // Query returning hash (associative array), first field will be array key // connection.queryHash = function (sql, values, callback) { - if (typeof values === 'function') { - callback = values; - values = []; - } - return this.query(sql, values, (err, res, fields) => { - if (err) return callback(err); + const queryOptions = createQuery(sql, values, callback); + const userCallback = queryOptions._callback; + + const callbackWrapper = (err, res, fields) => { + if (err) return userCallback(err); const result = {}; let i, row, keys; for (i in res) { @@ -181,20 +197,23 @@ const upgrade = connection => { keys = Object.keys(row); result[row[keys[0]]] = row; } - callback(err, result, fields); - }); + userCallback(err, result, fields); + }; + + queryOptions._callback = callbackWrapper; + + return this.query(queryOptions); }; // Query returning key-value array, // first field of query will be key and second will be value // connection.queryKeyValue = function (sql, values, callback) { - if (typeof values === 'function') { - callback = values; - values = []; - } - return this.query(sql, values, (err, res, fields) => { - if (err) return callback(err); + const queryOptions = createQuery(sql, values, callback); + const userCallback = queryOptions._callback; + + const callbackWrapper = (err, res, fields) => { + if (err) return userCallback(err); const result = {}; let i, row, keys; for (i in res) { @@ -202,8 +221,12 @@ const upgrade = connection => { keys = Object.keys(row); result[row[keys[0]]] = row[keys[1]]; } - callback(err, result, fields); - }); + userCallback(err, result, fields); + }; + + queryOptions._callback = callbackWrapper; + + return this.query(queryOptions); }; // SELECT SQL statement generator From a23d0b62f21bef8834c92ebeb78dcdb0f3bb4729 Mon Sep 17 00:00:00 2001 From: Angel Svirkov Date: Fri, 22 Oct 2021 15:15:55 +0200 Subject: [PATCH 2/3] Add mysql to dev dependencies - Calling `connection.query` with an options object fails after a connection has been upgraded #59 --- example.js | 1 - package-lock.json | 78 +++++++++++++++++++++++++++++++++++++++++++++++ package.json | 3 +- utilities.js | 3 +- 4 files changed, 81 insertions(+), 4 deletions(-) diff --git a/example.js b/example.js index b42f5ff..f82d1fb 100644 --- a/example.js +++ b/example.js @@ -1,6 +1,5 @@ 'use strict'; -/* eslint-disable import/no-unresolved */ const mysql = require('mysql'); const mysqlUtilities = require('./utilities'); diff --git a/package-lock.json b/package-lock.json index d71e25d..129fb7c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -173,6 +173,12 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "bignumber.js": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", + "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==", + "dev": true + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -271,6 +277,12 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -946,6 +958,12 @@ "has-symbols": "^1.0.2" } }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -1075,6 +1093,18 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "mysql": { + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", + "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==", + "dev": true, + "requires": { + "bignumber.js": "9.0.0", + "readable-stream": "2.3.7", + "safe-buffer": "5.1.2", + "sqlstring": "2.3.1" + } + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -1280,6 +1310,12 @@ "fast-diff": "^1.1.2" } }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -1313,6 +1349,21 @@ "read-pkg": "^3.0.0" } }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, "regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", @@ -1350,6 +1401,12 @@ "glob": "^7.1.3" } }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, "semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -1449,6 +1506,12 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "sqlstring": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", + "integrity": "sha1-R1OT/56RR5rqYtyvDKPRSYOn+0A=", + "dev": true + }, "string-width": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", @@ -1480,6 +1543,15 @@ "define-properties": "^1.1.3" } }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", @@ -1597,6 +1669,12 @@ "punycode": "^2.1.0" } }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, "v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", diff --git a/package.json b/package.json index e2b2845..a7ea031 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "eslint-config-prettier": "^8.3.0", "eslint-plugin-import": "^2.23.4", "eslint-plugin-prettier": "^3.4.0", - "prettier": "^2.3.2" + "prettier": "^2.3.2", + "mysql": "^2.18.1" } } diff --git a/utilities.js b/utilities.js index ea561ef..4f1a594 100644 --- a/utilities.js +++ b/utilities.js @@ -1,7 +1,6 @@ 'use strict'; - /* eslint-disable no-use-before-define */ -/* eslint-disable import/no-unresolved */ + const { createQuery } = require('mysql'); const identifierRegexp = /^[0-9,a-z,A-Z_.]*$/; From e54a2b44fba2ab43a4112880db1246be261cff44 Mon Sep 17 00:00:00 2001 From: Angel Svirkov Date: Fri, 22 Oct 2021 15:24:14 +0200 Subject: [PATCH 3/3] Add tests for new connection.query signature - Issue: Calling `connection.query` with an options object fails after a connection has been upgraded #59 --- example.js | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/example.js b/example.js index f82d1fb..de692e0 100644 --- a/example.js +++ b/example.js @@ -105,6 +105,16 @@ connection.query( } ); +connection.query( + { + sql: 'SELECT * FROM _Language where LanguageId > ?', + values: [2], + }, + (err, results) => { + console.dir({ query: results }); + } +); + connection.queryRow( 'SELECT * FROM _Language where LanguageId = ?', [3], @@ -113,6 +123,17 @@ connection.queryRow( } ); +connection.queryRow( + { + sql: 'SELECT * FROM _Language where LanguageId = ?', + values: [3], + timeout: 2000, + }, + (err, row) => { + console.dir({ queryRow: row }); + } +); + connection.queryValue( 'SELECT LanguageName FROM _Language where LanguageId = ?', [8], @@ -121,6 +142,16 @@ connection.queryValue( } ); +connection.queryValue( + { + sql: 'SELECT LanguageName FROM _Language where LanguageId = ?', + values: [8], + }, + (err, name) => { + console.dir({ queryValue: name }); + } +); + connection.queryHash( 'SELECT LanguageSign, LanguageId, LanguageName, Caption, LanguageISO ' + 'FROM _Language', @@ -130,10 +161,32 @@ connection.queryHash( } ); +connection.queryHash( + { + sql: + 'SELECT LanguageSign, LanguageId, LanguageName, Caption, LanguageISO ' + + 'FROM _Language', + values: [], + }, + (err, arr) => { + console.dir({ queryHash: arr }); + } +); + connection.queryCol('SELECT LanguageSign FROM _Language', [], (err, arr) => { console.dir({ queryCol: arr }); }); +connection.queryCol( + { + sql: 'SELECT LanguageSign FROM _Language', + values: [], + }, + (err, arr) => { + console.dir({ queryCol: arr }); + } +); + connection.queryKeyValue( 'SELECT LanguageISO, LanguageName FROM _Language', [], @@ -142,6 +195,17 @@ connection.queryKeyValue( } ); +connection.queryKeyValue( + { + sql: 'SELECT LanguageISO, LanguageName FROM _Language', + values: [], + timeout: 1000, + }, + (err, keyValue) => { + console.dir({ queryKeyValue: keyValue }); + } +); + connection.count('_Language', { LanguageId: '>3' }, (err, count) => { console.dir({ count }); });