SuperAPI AI 工具集

connect-from-typescript-and-node

编程与开发

查看项目

更新于 10-16 00:31

技能介绍

用途:指导在 TypeScript 或 JavaScript(Node.js)应用中通过 mssql 包连接 Azure SQL Database,底层使用 tedious 驱动。

所需包:mssql 提供连接池、参数化请求和事务;tedious 是 TDS 协议实现,由 Microsoft 命名并参与贡献,但官方声明为社区支持、无 Microsoft 支持;@types/mssql 提供 TypeScript 类型定义,mssql 本身不发布类型字段。安装:npm install mssql;npm install --save-dev @types/mssql。mssql 12.7.0 接受 tedious ^19.2.2 || ^20.0.0,声明 engines.node >= 18.19.0;tedious 20.0.0 声明 engines.node >= 22。Node 22 及以上解析为 tedious 20,Node 18 会静默停留在 19,建议在 package.json 和 CI 中固定 Node 版本。

连接配置:包含 server(形如 <server>.database.windows.net)、port(必须是数字,不能是字符串)、database、options(encrypt 与 trustServerCertificate)以及 pool(max、min、idleTimeoutMillis)。在这些版本中 encrypt 默认为 true、trustServerCertificate 默认为 false,但早期主版本行为不一致,建议固定版本而非依赖默认值。示例 pool.max 为 10,对玩具项目是下限、对真实 API 是上限,应有意设定。

连接池:sql.connect(config) 不会打开连接,而是在首次调用时构建进程级 ConnectionPool,之后每次返回同一个池。应在模块级创建一次并由所有代码 await,例如 export const poolPromise = new sql.ConnectionPool(config).connect();,处理器中仅 const pool = await poolPromise。若把池放进请求处理器,每次调用都会新建池,付出 TCP 连接、TLS 握手和登录成本,并各自持有套接字。不要在处理器末尾调用 sql.close(),它会在请求仍在使用时销毁全局池;对新建的 sql.ConnectionPool 调用只会关闭 sql.connect() 构建的池并返回 null。应使用 pool.close(),且仅在关闭路径调用。无服务器主机中模块作用域在热调用间保留,处理器体不保留,这正是复用可行的原因。

Microsoft Entra ID 无密钥认证:mssql 将认证直接透传给 tedious。可用 authentication.type 包括 azure-active-directory-default(本地开发和多数 Azure 主机,走 @azure/identity 链)、azure-active-directory-msi-app-service、azure-active-directory-msi-vm、azure-active-directory-service-principal-secret、azure-active-directory-access-token、token-credential;azure-active-directory-password 已被 Microsoft 弃用,不要使用。@azure/identity 是 tedious 的依赖,无需额外安装。此配置不含密钥,可安全入库;SQL 认证变体则不行。身份仍需数据库主体。

类型化结果:pool.request().input('id', sql.Int, id).query<Person>('...') 中 query<T>() 的泛型只是编译期断言,不做运行时校验;列重命名会导致运行时 undefined 而类型仍编译通过,若关心形状需校验行或从模式生成类型。每个值都应使用 request.input(name, type, value),拼接进 SQL 文本会引入注入。

自检:通过 mssql 本身查询 sys.dm_exec_connections,读取 encrypt_option、db、login、db_user 及 pool.size 等。pool.size 在 await 池之前读取会抛 TypeError。sys.dm_exec_connections 需要 VIEW DATABASE STATE,在 Basic、S0、S1 和弹性池上需服务器管理员、Microsoft Entra 管理员或 ##MS_ServerStateReader##,检查后应撤销。

限制:不要在处理程序、路由或无服务器函数体内调用 sql.connect() 或构建池;不要在非关闭路径调用 pool.close();不要用 trustServerCertificate: true 消除证书错误;不要使用 azure-active-directory-password;不要在此写重试循环。不支持 TCP 套接字的运行时无法运行 mssql,应改用 HTTP 数据或 API 层。官方未提供的具体价格、效果等信息暂未提供。