如何使用mssql模块从Node.JS使用Windows身份验证连接到SQL Server

F0r*_*00b 34 sql-server node.js npm

嗨,我无法连接到在节点js中使用Windows身份验证的SQL服务器.我正在使用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' }
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

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();
Run Code Online (Sandbox Code Playgroud)

Aar*_*ard 27

由于这是一个相当明显的答案,我想添加一个代码片段,该代码片段适用于Trusted Connection.从getglad编辑的答案得到它.

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
});
Run Code Online (Sandbox Code Playgroud)

使用可信连接,我能够执行存储过程,记录输出并关闭连接而没有任何麻烦,并且msnodesqlv8最近更新比任何其他驱动程序更新(最新版本是2016年10月至2016年11月3日) ),所以这似乎也是一个安全的选择.

这是一个使用mssql@4.0.4的例子.唯一的变化是初始需求,它从mssql中引入msnodesqlv8,而sql.Connection现在是sql.ConnectionPool.您还需要更改存储过程调用,因为响应不同,请在此处注明.感谢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
});
Run Code Online (Sandbox Code Playgroud)

  • 我意识到这是一个较旧的评论,但是当我尝试上面的代码时,我收到“用户''登录失败。” 不知道为什么它没有提取我的 Windows 信息。 (4认同)

get*_*lad 22

我从来没有能够使用mssql+ windows auth来为我的任何项目工作.尝试edgeedge-sql-它已经为我工作.确保安装所有必需的软件包.

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");
   }
 });
Run Code Online (Sandbox Code Playgroud)

编辑

好吧...在我原来的答案后10天,显然mssql已将Windows Auth添加到包中.他们听到了我们的哭声:) 看到这里.我还没有测试过它,但它正在我的积压测试集成中.我会报告回来.

FWTW,如果mssql符合您的需求,我会继续使用它,因为1)edge-sql已经休眠了2年2)主要贡献者说他已经离开这样的项目" 在微软的关怀之手 ",因为他不再工作那里.

编辑2

这继续得到upvotes并且有评论说其他一些答案'代码示例要么不工作,要么不在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
});
Run Code Online (Sandbox Code Playgroud)

  • @ChrisPeacock尝试用`var sql = require('mssql/msnodesqlv8')替换`var sql = require('mssql');` - 显然在https://github.com/patriksimek/node-mssql#中改变了3倍至4倍,变化 (2认同)

小智 19

关于如何使用mssql + Windows Auth,我一直在努力,这是我如何使用它来处理我的项目.

正如在mssql文档中指出的那样,你也需要安装msnodesqlv8.

npm install msnodesqlv8
Run Code Online (Sandbox Code Playgroud)

现在,按照Aaron Ballard的回答,您可以像这样使用它:

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)
    })
})
Run Code Online (Sandbox Code Playgroud)

作为一个说明,我试图将此作为对Aaron答案的评论,因为我的答案只是对他的补充/更新,但我没有足够的声誉这样做.

  • 干得好!测试连接时,每个人都应该始终使用该查询.....选择1作为数字 (3认同)

Dav*_*ave 6

我尝试了许多变体,这是我的完整解决方案。
我正在使用SQL Server Express
首先,我仅连接到MASTER数据库。
您只需要更改“ YOURINSTANCE \\ SQLEXPRESS ”。
(请确保保持上面的双斜线!!!)
我也在使用集成安全性
查询完全不依赖任何内容(在数据库中)。
您需要添加节点程序包
  ==> NPM INSTALL MSSQL
  ==> NPM INSTALL 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);
});
Run Code Online (Sandbox Code Playgroud)


小智 5

为我

我使用的连接设置如下

"server":"",
"domain":"", //sepcify domain of your user 
"port": ,
"user":"", // enter username without domain
"password":"",
"database":""
Run Code Online (Sandbox Code Playgroud)

和 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);
Run Code Online (Sandbox Code Playgroud)