能否使用tedious-connection-pool通过azure-active-directory-msi-app-service连接Azure AD SQL Server
解决方案
问题根因
你遇到的报错本质是tedious-connection-pool这个第三方包已经多年未更新,没有适配tedious后续新增的Azure AD托管身份认证逻辑,只会默认读取userName和password配置字段,当你用MSI认证时没有配置这两个字段,就会出现空用户的登录失败错误。
替代方案
建议直接使用tedious官方内置的连接池功能,从tedious v14开始官方已经原生支持连接池,完全适配所有Azure AD认证方式,不需要依赖第三方的tedious-connection-pool包。
可运行示例代码
const { ConnectionPool, Request } = require('tedious'); // 连接池配置 const poolConfig = { min: 2, max: 4, log: true }; // 连接配置 const connectionConfig = { server: '你的SQL服务器地址,格式为xxx.database.windows.net', authentication: { type: 'azure-active-directory-msi-app-service', options: { clientId: '你的托管身份客户端ID' } }, options: { database: '你的数据库名', encrypt: true, port: 1433 } }; // 初始化官方连接池 const pool = new ConnectionPool(poolConfig, connectionConfig); // 监听连接池错误 pool.on('error', (err) => { console.error('连接池错误:', err); }); // 连接池就绪后执行查询 pool.acquire().then(connection => { const request = new Request('select * from Users', (err, rowCount) => { if (err) { console.error('查询错误:', err); connection.release(); return; } console.log('查询到的行数:', rowCount); // 释放连接回连接池 connection.release(); }); // 处理返回的行数据 request.on('row', (columns) => { console.log('行数据:', columns.map(col => col.value)); }); // 执行SQL connection.execSql(request); }).catch(err => { console.error('获取连接失败:', err); });
前置检查项
- 确认你使用的tedious版本 >= 14.0.0,可执行
npm list tedious查看版本 - 确认Azure SQL服务器已经为你使用的托管身份开通了对应数据库的访问权限
- 确认代码运行环境(App Service、Function等)已经启用了对应托管身份
内容的提问来源于stack exchange,提问作者mrsrizan
相关产品推荐
相关产品推荐

