【问题标题】:How to connect to SQL Server with windows authentication from Node.JS using mssql module如何使用 mssql 模块通过 Node.JS 的 Windows 身份验证连接到 SQL Server
【发布时间】:2016-02-16 01:00:24
【问题描述】:

您好,我无法连接到在节点 js 中使用 Windows 身份验证的 SQL Server。我正在使用 mssql 模块。错误信息是:

[ConnectionError: Login failed for user ''. The user is not associated with a trusted SQL Server connection.]
name: 'ConnectionError',
message: 'Login failed for user \'\'. The user is not associated with a trusted SQL Server connection.',
code: 'ELOGIN' }

这是我的代码:

config = {
    server : "localhost\\MSSQLSERVER",
    database : "mydatabase",
    port : 1433
}

function loadDepts() {
    var conn = new sql.Connection(config);
    var request = sql.Request(conn);

    conn.connect(function(err) {
    if (err) {
        console.log(err);
        return;
    }

    request.query("select deptid, deptname from departments", function(err, table) {
        if (err) {
           console.log(err);
           return;
        }
        else {
           console.log(table);
        }

        conn.close();
        });
    });
}

loadDepts();

【问题讨论】:

  • 你把用户名放在哪里了?
  • 我没有输入用户名,因为我的 SQL Server 的身份验证方法是 Windows 身份验证。在 .Net 中,这就是我定义连接字符串的方式:“Server=localhost;Integrated Security=SSPI;Database=mydatabase”。不知道如何在 Node.js 中实现类似的东西。
  • 哦,我使用 sa 帐户通过 SQL 服务器身份验证对其进行了测试,并且它可以正常工作。但我需要的是让它在 Windows 身份验证中工作。

标签: sql-server node.js npm


【解决方案1】:

我从来没有让mssql + windows auth 为我的任何项目工作。试试edgeedge-sql - 它对我有用。 Be sure you install all the required packages.

https://github.com/tjanczuk/edge

https://github.com/tjanczuk/edge-sql

从那里开始,它非常流畅。

var edge = require('edge');
var params = {
  connectionString: "Server=YourServer;Database=YourDB;Integrated Security=True",
  source: "SELECT TOP 20 * FROM SampleData"
};  
var getData = edge.func( 'sql', params);

getData(null, function (error, result) {
   if (error) { console.log(error); return; }
   if (result) {
    console.log(result);
   }
   else {
    console.log("No results");
   }
 });

编辑

嗯...在我最初回答之后的 10 天,显然 mssql 将 Windows Auth 添加到包中。他们听到了我们的呼喊:) See here。我还没有测试它,但它正式在我的待办事项中测试集成。我会回来报告的。

FWTW,如果 mssql 符合您的需求,我会选择它,因为 1) edge-sql 已休眠 2 年,并且 2) 主要贡献者说他已经离开了这样的项目“in the caring hands of Microsoft” ,因为他不再在那里工作。

编辑 2

这不断得到支持,并且有 cmets 说其他一些答案的代码示例在 Windows 上不起作用或不起作用。

这是我使用 mssql 的代码,在 Windows 上运行,还安装了 msnodesqlv8

var sql = require('mssql/msnodesqlv8');
var config = {
  driver: 'msnodesqlv8',
  connectionString: 'Driver={SQL Server Native Client XX.0};Server={SERVER\\NAME};Database={dbName};Trusted_Connection={yes};',
};

sql.connect(config)
.then(function() {
 ...profit...
})
.catch(function(err) {
  // ... connect error checks
});

【讨论】:

  • 我对@9​​87654326@ 上的 Windows Auth 不太满意。
  • @getglad 请您举一个带有实际值的连接字符串的具体示例吗?我对 {} 在实践中是否应该存在感到有些困惑,我收到“TypeError: Invalid server: undefined”
  • @ChrisPeacock 尝试用var sql = require('mssql/msnodesqlv8'); 替换var sql = require('mssql'); - 显然是github.com/patriksimek/node-mssql#3x-to-4x-changes 中的重大变化
  • 谢谢@getglad!那,以及对“Driver = ...”位的更改修复了它。我没有意识到连接字符串中的 Driver 引用了一个 ODBC 驱动程序(我什至没有意识到 ODBC 出现在其中)。
  • @previousdeveloper 你现在知道如何让它在 linux 中工作
【解决方案2】:

我很难连接到使用 windows 身份验证模式 在远程 Windows 服务器中运行的 mssql 服务器。然后我发现就像下面的代码一样使用的解决方案。

sql.connect("Data Source=172.25.x.x,1433;User Id=CSLx\\Name;Password=xxxxxx1234;Initial Catalog=giveTHedataabseNamel;Integrated Security=True",function(err){ }

【讨论】:

  • 你提供windows密码吗?我们不应该为窗口身份验证提供 Windows 密码。它应该自动采取哪个用户正在运行该应用程序..
  • node mssql 模块没有使用 Windows 身份验证登录的选项,为了实现,我可以找到上述唯一的方法,有关更多详细信息,请参阅 git hub 问题。 github.com/patriksimek/node-mssql/issues/338
【解决方案3】:

由于这是一个相当明显的答案,我想添加一个代码 sn-p,它适用于我的 Trusted Connection。从getglad's 编辑的答案中得到它。

const sql = require("mssql");
require("msnodesqlv8");
const conn = new sql.Connection({
  database: "db_name",
  server: "server_name",
  driver: "msnodesqlv8",
  options: {
    trustedConnection: true
  }
});
conn.connect().then(() => {
  // ... sproc call, error catching, etc
  // example: https://github.com/patriksimek/node-mssql#request
});

使用受信任的连接,我能够毫无问题地执行存储过程、记录输出并关闭连接,并且msnodesqlv8 的更新时间比其他任何驱动程序都更新(最新版本是 2016 年 10 月2016 年 11 月 3 日),所以这似乎也是一个安全的选择。

这是一个使用 mssql@4.0.4 的示例。唯一的变化是初始要求,它从 mssql 中拉入 msnodesqlv8,并且 sql.Connection 现在是 sql.ConnectionPool。由于响应不同,您还需要更改存储过程调用,请注意here。感谢 Jon 的回答,因为他在我之前更新了我的!

const sql = require("mssql/msnodesqlv8");
const conn = new sql.ConnectionPool({
  database: "db_name",
  server: "server_name",
  driver: "msnodesqlv8",
  options: {
    trustedConnection: true
  }
});
conn.connect().then(() => {
  // ... sproc call, error catching, etc
  // example: https://github.com/patriksimek/node-mssql#request
});

【讨论】:

  • 我意识到这是一个较旧的评论,但是当我尝试上面的代码时,我得到“用户登录失败”。不知道为什么它没有拉入我的 Windows 信息。
  • @Holt - 我只能使用实际的连接字符串让它工作。如果有帮助,我已经在我的答案中添加了一个代码示例
  • 我们可以将 msnodesqlv8 与 knexjs 一起使用吗?
  • @VictorioBerra 正如此处所述,我们将其与 knexjs 一起使用的机会非常渺茫:stackoverflow.com/a/57397602/3647782 Knexjs mssql 方言使用硬编码的繁琐驱动程序,无法通过配置简单地更改它。跨度>
【解决方案4】:

我也一直在为如何使用 mssql + Windows Auth 苦苦挣扎,这就是我如何让它在我的项目中工作。

正如mssql documentation 中指出的,您也需要安装 msnodesqlv8。

npm install msnodesqlv8

现在,跟随Aaron Ballard's answer,你可以这样使用它:

const sql = require('mssql/msnodesqlv8')

const pool = new sql.ConnectionPool({
  database: 'database',
  server: 'server',
  driver: 'msnodesqlv8',
  options: {
    trustedConnection: true
  }
})

pool.connect().then(() => {
  //simple query
  pool.request().query('select 1 as number', (err, result) => {
        console.dir(result)
    })
})

作为说明,我尝试将此添加为对 Aaron 回答的评论,因为我的只是对他的补充/更新,但我没有足够的声誉这样做。

【讨论】:

  • 干得好!每个人都应该在测试连接时始终使用该查询.....选择 1 作为数字
【解决方案5】:

我尝试了很多变体,这是我的完整解决方案。
我正在使用 SQL server Express
首先,我只连接到 MASTER 数据库。
您只需更改“YOURINSTANCE\\SQLEXPRESS”。
(一定要保持上面的双斜线!!!)
我也在使用 INTEGRATED SECURITY
查询完全不依赖任何东西(在您的数据库中)。
您需要添加节点包
==> NPM 安装 MSSQL
==> NPM 安装 msnodesqlv8
希望您的连接问题将成为过去。
也许吧。
请。

// More here -> https://www.npmjs.com/package/mssql
var sql = require('mssql/msnodesqlv8');
var config = {
  connectionString: 'Driver=SQL Server;Server=YOURINSTANCE\\SQLEXPRESS;Database=master;Trusted_Connection=true;'
};
sql.connect(config, err => {
  new sql.Request().query('SELECT 1 AS justAnumber', (err, result) => {
    console.log(".:The Good Place:.");
    if(err) { // SQL error, but connection OK.
      console.log("  Shirtballs: "+ err);
    } else { // All is rosey in your garden.
      console.dir(result);
    };
  });
});
sql.on('error', err => { // Connection borked.
  console.log(".:The Bad Place:.");
  console.log("  Fork: "+ err);
});

【讨论】:

  • 是“Fork:”错误还是“Shirtballs:”错误?
  • 如果是“Fork”错误,值得再次仔细检查您的连接字符串。
  • 它的工作,谢谢,我只需要安装并添加 msnodesqlv8
【解决方案6】:

我刚刚在配置中添加了 domain: "DNAME",因此这个配置可以帮助我使用 windows auth 连接到 MS SQL。

const config = {
            driver: 'msnodesqlv8',
            domain: "DNAME",
            user: 'username',
            password: 'pass',
            server: '7.6.225.22',
            database: 'DBNAME',
            requestTimeout: 3600000, //an hour
            options: {
                trustedConnection: true
            },
            debug: true,
            parseJSON: true
        };

【讨论】:

    【解决方案7】:

    我只能使用带有连接字符串(而不是配置对象)的 msnodesqlv8(仅限于 Windows 环境)获得可信连接。

    const sql = require("msnodesqlv8");
    
    const connectionString = function(databaseName) {
        return "Server=.;Database=" + databaseName + ";Trusted_Connection=Yes;Driver={SQL Server Native Client 11.0}";
    }
    
    sql.query(connectionString("DatabaseName"), "SELECT * FROM dbo.Table1" , (err, recordset) => {
        if(err) {
            // Do something with the err object.
            return;
        }
    
        // else
        // Do something with the recordset object.
        return;
    });
    

    【讨论】:

      【解决方案8】:

      下面的代码对我有用......

      const sql = require('mssql/msnodesqlv8')
      // config for your database
      var config = {
          driver: 'msnodesqlv8',
          server: 'serverNAme\\SQLEXPRESS', 
          database: 'Learn' , 
          options: {
              trustedConnection: true
          }
      };
      

      【讨论】:

        【解决方案9】:

        它对我有用 需要安装 msnodesqlv8 和 mssql。还有.......:)

            var dbConfig = {
              driver: 'msnodesqlv8',  
              server: "DESKTOP-66LO4I3",
              database: "FutureHealthCareWeb",
              user: "sa",
              password: "pass@123",
              options: {
                trustedConnection: true
            },
            debug: true,
            parseJSON: true
            }; 
            var sql = require('mssql/msnodesqlv8');
        
              sql.connect(dbConfig, function (err) {
              if (err) { console.log(JSON.stringify(err)+'..............') }
              else {
                console.log('Connected')
              }
            }
            );
        

        【讨论】:

          【解决方案10】:

          此版本不需要用户名或密码。

          为了使用 windows 身份验证,我安装了 mssql 和 msnodesqlv8。

          然后在我的 app.js 文件中:

          const mssql = require('mssql/msnodesqlv8'); 
          

          请注意,如果您使用此示例,则它是 mssql 而不是 sql。

          var config = {
            database:'YOUR DATABASE NAME',  
            server: 'localhost\\SQLEXPRESS',
            driver: 'msnodesqlv8',
            options: {
              trustedConnection: true,
              enableArithAbort: true
            }
          };
          

          您需要在 config.xml 中更改数据库名称。除此之外它应该工作。我的例子:

          app.get('/', function (req, res) {
          
                  mssql.connect(config, function (err) {
              
                      if (err) console.log(err);
                      var request = new mssql.Request();
                      request.query('select * from dbo.visit', function (err,  result) {
                          if(err) console.log(err);
                          console.log(result);
                      });
              
                  });
              
           });
          

          【讨论】:

            【解决方案11】:

            对我来说

            我使用如下连接设置

            "server":"",
            "domain":"", //sepcify domain of your user 
            "port": ,
            "user":"", // enter username without domain
            "password":"",
            "database":""
            

            和 TS 代码

            import * as sql from 'mssql';
            
            const pool = await new sql.ConnectionPool(connection).connect();
            const result = await pool.request()
                        .query(`SELECT count(idpart) part_computed FROM demo.PARTs;`);
            pool.close();
            return Promise.resolve(result.recordset);
            

            【讨论】:

              【解决方案12】:

              这对我有用

              const sql = require("mssql/msnodesqlv8");
              
              const conn = new sql.ConnectionPool({
                  database: "DB name",
                  server: "server name",
                  driver: "msnodesqlv8",
                  options: {
                      trustedConnection: true
                  }
              });
              conn.connect().then((err) => {
                  if(err) throw err;
                  else console.log("connected");
                  
                  const req = new sql.Request(conn)
                  req.query("select * from table", function(error, res){
                      console.log(res)
                  })
              });
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2014-07-27
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-05-07
                • 1970-01-01
                • 2017-11-18
                相关资源
                最近更新 更多