You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Knex.js连接Microsoft SQL Server时遭遇getaddrinfo ENOTFOUND错误的求助

解决Knex.js连接Microsoft SQL Server时的getaddrinfo ENOTFOUND错误

你已经做了不少基础排查(DNS解析、换IP、确认SQL Server可正常访问),但还是卡在地址解析这一步,咱们从MSSQL命名实例的连接配置细节入手,一步步拆解问题:

1. 修正实例名的配置逻辑

你当前把实例名docx拼在服务器名后面(filesrv\\docx),但Knex依赖的tedious驱动对命名实例的处理更推荐单独指定参数,而不是把实例名和服务器名混在一起——这正是导致DNS解析失败的核心原因之一(DNS无法识别带反斜杠的主机名)。试试调整配置结构:

const knex = require('knex')({ 
  client: 'mssql', 
  connection: { 
    server: 'filesrv', // 只保留服务器名/IP地址
    user: 'user',
    password: 'secret',
    database: 'DX_Matching_DB', // database需放在connection根节点,而非options内
    port: 1433, // port同样直接放在connection根节点
    options: { 
      instanceName: 'docx', // 单独指定命名实例
      encrypt: false, // 内部网络连接可关闭加密,避免额外验证问题
      trustServerCertificate: true // 若使用自签证书,开启该选项跳过证书验证
    } 
  } 
});

2. 确认命名实例的实际端口

如果docx是命名实例,默认不会使用1433端口(1433是MSSQL默认实例的固定端口):

  • 打开SQL Server配置管理器,找到SQL Server网络配置 → MSQL$DOCX的协议(对应你的命名实例)
  • 启用TCP/IP协议,双击打开属性,切换到IP地址标签,查看IPAll下的TCP端口(可能是动态生成的,比如1434或其他数值)
  • 将Knex配置里的port替换为这个实际端口,同时确保Windows防火墙允许该端口的入站连接

如果不想指定固定端口,需要确保SQL Server Browser服务处于运行状态(该服务通过UDP 1434端口解析命名实例的动态端口),且防火墙允许UDP 1434的入站请求。

3. 用IP地址测试的注意事项

当你换成IP地址时,同样不要把实例名拼在IP后面(比如192.168.1.100\\docx),保持server: '192.168.1.100',然后在options.instanceName里指定docx。另外要确认:

  • SQL Server配置管理器中,TCP/IP协议已启用对应IP的监听(在TCP/IP属性的IP地址列表中,确保目标IP的已启用为Yes)

4. 验证SQL Server的远程连接权限

  • 打开SQL Server Management Studio,右键服务器 → 属性 → 连接,确认「允许远程连接到此服务器」已勾选
  • 检查你使用的user账号:确保它拥有远程连接权限,且能正常访问DX_Matching_DB数据库

5. 跳过Knex直接测试基础连接

为了排除Knex的配置干扰,你可以用tedious驱动写一个极简测试脚本,确认底层连接是否正常:

const { Connection } = require('tedious');

const config = {
  server: 'filesrv',
  authentication: {
    type: 'default',
    options: {
      userName: 'user',
      password: 'secret'
    }
  },
  options: {
    instanceName: 'docx',
    database: 'DX_Matching_DB',
    port: 1433, // 替换为实际端口
    encrypt: false,
    trustServerCertificate: true
  }
};

const connection = new Connection(config);

connection.on('connect', (err) => {
  if (err) {
    console.error('连接失败:', err.message);
  } else {
    console.log('连接成功!');
  }
});

connection.connect();

如果这个脚本能成功连接,说明问题出在Knex的配置结构上;如果还是失败,那就是SQL Server的网络配置或防火墙问题。

内容的提问来源于stack exchange,提问作者Tim Vahlbrock

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 16:22:48