如何使用 knex 模块从 Node.JS 通过 Windows 身份验证连接到 SQL 服务器

How to connect to SQL Server with Windows authentication from Node.JS using knex module

我正在尝试使用 knex 连接 SQL 服务器,并从我的 node.js 应用程序进行 Windows 身份验证。

配置:

 {
  client: 'mssql',
  connection: {
    database: 'MyDBName',
    host: 'xx.xx.xx.xxx',
    server: 'MY-SERVER_NAME\SQLEXPRESS',
    options: {
      encrypt: false,
      trustedConnection: true,
    },
  },
}

我没有在配置中添加用户名和密码,因为我为 Windows 添加了 trustedConnection: true 身份验证.

但我收到以下错误:

Login failed for user ''.

即使我添加用户名和密码,我也会得到同样的错误。

任何建议都会有很大帮助。谢谢

knex 使用 mssql,后者又使用 tediousmsnodesqlv8tedious 不支持 Windows 身份验证。默认值为 tedious。尝试将 tedious 与 Windows 身份验证结合使用会导致... Login failed for user ''.。完整的错误信息是:

(node:16568) UnhandledPromiseRejectionWarning: ConnectionError: Login failed for user ''.
    at Connection.<anonymous> (K:\testprojects\nodesql\node_modules\mssql\lib\tedious.js:244:17)
    at Object.onceWrapper (events.js:291:20)
    at Connection.emit (events.js:203:13)
    at Connection.processLogin7Response (K:\testprojects\nodesql\node_modules\mssql\node_modules\tedious\lib\connection.js:1397:14)
    at Connection.message (K:\testprojects\nodesql\node_modules\mssql\node_modules\tedious\lib\connection.js:1932:14)
    at Connection.dispatchEvent (K:\testprojects\nodesql\node_modules\mssql\node_modules\tedious\lib\connection.js:1084:36)
    at MessageIO.<anonymous> (K:\testprojects\nodesql\node_modules\mssql\node_modules\tedious\lib\connection.js:984:14)
    at MessageIO.emit (events.js:203:13)
    at Message.<anonymous> (K:\testprojects\nodesql\node_modules\mssql\node_modules\tedious\lib\message-io.js:32:14)
    at Message.emit (events.js:208:15)

这清楚地表明来源是tedious

为了得到这个,我使用了这个片段:


const sql = require("mssql");
const config  = {
  database: "Master",
  server: "myserver",
  options: {
    trustedConnection: true
  }
};


(async () => {
        await sql.connect(config)
        const result = await sql.query`select name from sys.databases`
        console.dir(result)
})()

需要使用const sql = require("mssql/msnodesqlv8");才能使用msnodesqlv8docs explain,例如:

const sql = require("mssql");
const config  = {
  database: "Master",
  server: "myserver",
  options: {
    trustedConnection: true
  }
};

此更改后,查询运行并生成数据库名称列表

不幸的是,这对 knex 没有帮助,因为它 loads and uses tedious directly. Despite what the code comment says, msnodesqlv8 正在积极维护并且仅在 4 天前发布。

我能够通过基于 this example

制作新方言使用 msnodeqlv8 进行连接

我刚刚添加了 msnodesqlv8 模块并使用了以下代码,希望它能帮助到别人:

require('mssql/msnodesqlv8');
let Knex = require("knex");

let Dialect = require(`knex/lib/dialects/mssql/index.js`);
Dialect.prototype._driver = () => require('mssql/msnodesqlv8');

let sql = Knex({
  client: Dialect,
  connection: {
    server: "<sql server>",
    port: 1433,
    database: "<database name>",
    driver: "msnodesqlv8",
    options: {
        trustedConnection: true
      }
  }
});

谢谢