Sql server 如何使用mssql模块通过Node.JS的windows身份验证连接到SQL Server

Sql server 如何使用mssql模块通过Node.JS的windows身份验证连接到SQL Server,sql-server,node.js,npm,Sql Server,Node.js,Npm,您好,我无法连接到在节点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 a

您好,我无法连接到在节点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();

我从来没有能够让
mssql
+windowsauth为我的任何项目工作过。试试
edge
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添加到包中。他们听到了我们的喊声:)。我还没有对它进行测试,但它已经正式在我的待办事项列表中,用于测试集成。我会回来报到的

FWTW,如果
mssql
符合您的需要,我会同意,因为1)
edge sql
已经休眠了2年,2)主要贡献者说他已经离开了这样的项目,因为他不再在那里工作

编辑2

这不断得到支持,并且有评论说其他一些答案的代码示例要么不起作用,要么在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
});

我很难使用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){ }

因为这是一个相当明显的答案,所以我想添加一个代码片段,该代码片段适用于我的受信任连接。从编辑后的答案开始

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
});
使用trusted connection,我能够执行存储过程、记录输出并关闭连接,没有任何问题,并且比任何其他驱动程序更新得都快(最新版本是2016年10月,截至2016年11月3日),因此这似乎也是一个安全的选择

下面是一个使用mssql@4.0.4. 唯一的更改是初始require,它从mssql中引入msnodesqlv8,而sql.Connection现在是sql.ConnectionPool。您还需要更改存储过程调用,因为响应不同。乔恩的回答值得称赞,因为他比我先更新了我的答案

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

关于如何使用mssql+WindowsAuth,我也苦苦挣扎了一段时间,下面是我如何让它在我的项目中发挥作用的

正如中所指出的,您还需要安装msnodesqlv8

npm install msnodesqlv8
接下来,您可以这样使用它:

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答案的评论,因为我的回答只是对他的补充/更新,但我没有足够的声誉来这么做。

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


我刚刚在配置中添加了域:“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
        };

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


下面的代码正在为我工作

const sql = require('mssql/msnodesqlv8')
// config for your database
var config = {
    driver: 'msnodesqlv8',
    server: 'serverNAme\\SQLEXPRESS', 
    database: 'Learn' , 
    options: {
        trustedConnection: true
    }
};
它对我有用 需要安装msnodesqlv8和mssql。也……:)


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

为了使用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
  }
};
您需要在配置中更改数据库名称。除此之外,它应该是有效的。我的例子是:

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);
            });
    
        });
    
 });
对我来说

我使用了如下的连接设置

"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);
这对我有用

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

你把用户名放在哪里了?我没有放用户名,因为我的SQL Server的身份验证方法是Windows身份验证。在.Net中,我将这样定义我的连接字符串:“Server=localhost;integratedsecurity=SSPI;Database=mydatabase”。不过我不知道如何在Node.js中实现类似的功能。哦,我使用sa帐户使用SQL server身份验证对其进行了测试,结果证明它是有效的。但我需要的是它能在Windows身份验证中工作。我在Windows Auth开启时运气不太好。@GetGlady请给出一个带有实际值的连接字符串的具体示例好吗?我有点困惑{}在实践中是否应该存在,我得到了“TypeError:Invalid server:undefined”@ChrisPeacock尝试替换
var sql=require('mssql')带有
var sql=require('mssql/msnodesqlv8')-显然在感谢@getglady中破坏了更改!这一点,再加上对“Driver=…”位的修改,就解决了这个问题。我没有意识到连接字符串中的驱动程序引用了ODBC驱动程序(我甚至没有意识到ODBC也包含在其中)。@previousdeveloper您现在知道如何在Linux中实现此功能了吗?您是否提供了windows密码?我们不应该为窗口身份验证提供windows密码。它应该会自动判断哪个用户正在运行应用程序。节点mssql模块没有使用windows身份验证登录的选项。为了实现,我可以找到上面唯一的方法,有关更多详细信息,请参阅git hub问题。我意识到这是一个较旧的注释,但当我尝试上面的代码时,我得到的是“用户“”登录失败”。不确定为什么它没有拉入我的windows信息。@Holt-我只能使用实际的连接字符串使它工作。我
"server":"",
"domain":"", //sepcify domain of your user 
"port": ,
"user":"", // enter username without domain
"password":"",
"database":""
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);
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)
    })
});