【问题标题】:How to connect to SQL Server with Windows authentication from Node.JS using knex module如何使用 knex 模块从 Node.JS 通过 Windows 身份验证连接到 SQL Server
【发布时间】:2019-08-07 09:07:32
【问题描述】:

我正在尝试使用 knex 与我的 node.js 应用程序中的 Windows 身份验证连接 SQL Server。

配置:

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

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

但我收到以下错误:

用户 '' 登录失败。

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

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

【问题讨论】:

  • 这意味着运行代码的帐户没有连接权限。您是否尝试过使用 SSMS 或 Azure Data Studio 连接到服务器(尽管名称如此,但无论它在哪里运行,它都是 SQL Server 的跨平台数据库客户端)
  • 我确实有权限。我可以使用 Windows 凭据从 SQL Server Management Studio 访问。我认为我的 nodejs 应用程序无法获得凭证
  • BTW ADS 基于 VS Code,即基于 Electron,即 Node.js。
  • 我不知道 Azure Data Studio
  • 您使用的是哪些软件包和版本?您的目标是哪个 SQL Server 版本? knex 使用 mssql,而后者又使用 tediousmsnodesqlv8。您可以直接使用两个驱动程序之一来查看它们是否可以连接。它是负责实际连接的人之一。这样您就可以隔离问题并检查是否存在已知错误或更新版本

标签: node.js sql-server connection-string windows-authentication knex.js


【解决方案1】:

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

为了得到这个,我使用了这个 sn-p :


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

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

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

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

不幸的是,这对knex 没有帮助,因为它直接是loads and uses tedious。尽管代码注释说了什么,msnodesqlv8 得到积极维护,并且仅在 4 天前发布。

【讨论】:

  • 谢谢!我把笔记本电脑忘在办公室了……我明天试试这个,然后回复你。
  • @AdritaSharma 不幸的是,这不适用于 knex,因为它会加载 tedious directly cmets 中的推理不再成立,因为 msnodesqlv8 得到积极维护
  • 感谢您的详细解释。我会尝试msnodesqlv8
  • 我使用了msnodesqlv8 并且能够连接。谢谢
  • @PanagiotisKanavos 感谢您的回答!但现在我想知道,有没有一种可行的方法可以让 knex 使用它?
【解决方案2】:

我可以通过基于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
      }
  }
});

谢谢

【讨论】:

  • 我从这段代码中得到这个错误 TypeError: Driver.Connection is not a constructor
猜你喜欢
  • 2016-02-16
  • 2014-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多