Knex无法通过命名管道连接LocalDB实例问题求助
Knex连接LocalDB命名管道报错解决
问题
我尝试通过命名管道np:\\.\pipe\LOCALDB#DBFBFA07\tsql\query使用Knex连接LocalDB实例,SSMS和sqlcmd均可正常连接,但将Knex配置中的server属性设为该命名管道时,出现错误:Failed to connect to: np:\\...\query - getaddrinfo ENOTFOUND np:\\...\query。
当前开发配置:
development: { client: "mssql", connection: { database: process.env.SQLSERVER_DB, user: process.env.SQLSERVER_USER, password: process.env.SQLSERVER_PASSWORD, server: process.env.SQLSERVER_SERVER } }
对应的.env配置:
SQLSERVER_DB=<db_name> SQLSERVER_USER=<username> SQLSERVER_PASSWORD=<password> SQLSERVER_SERVER="np:\\.\pipe\LOCALDB#DBFBFA07\tsql\query"
解决办法
Knex依赖的mssql驱动底层用的是tedious,它不会把server字段里的命名管道地址当作管道路径解析,反而会当成网络主机名去查询DNS,这才导致了getaddrinfo错误。你可以用以下两种方式调整配置:
方式一:通过LocalDB实例名连接
直接指定LocalDB实例名,不需要手动写命名管道路径:
development: { client: "mssql", connection: { database: process.env.SQLSERVER_DB, user: process.env.SQLSERVER_USER, password: process.env.SQLSERVER_PASSWORD, server: "(localdb)", options: { instanceName: "LOCALDB#DBFBFA07" } } }
对应的.env修改为:
SQLSERVER_DB=<db_name> SQLSERVER_USER=<username> SQLSERVER_PASSWORD=<password> SQLSERVER_INSTANCE=LOCALDB#DBFBFA07
方式二:手动指定命名管道路径
如果必须用命名管道地址,要把路径放在options.socketPath中,而非server字段:
development: { client: "mssql", connection: { database: process.env.SQLSERVER_DB, user: process.env.SQLSERVER_USER, password: process.env.SQLSERVER_PASSWORD, server: ".", options: { socketPath: process.env.SQLSERVER_PIPE_PATH } } }
对应的.env调整为:
SQLSERVER_DB=<db_name> SQLSERVER_USER=<username> SQLSERVER_PASSWORD=<password> SQLSERVER_PIPE_PATH=np:\\.\pipe\LOCALDB#DBFBFA07\tsql\query
注意:.env里的环境变量不要加双引号,部分加载工具会保留引号,导致路径无效。
内容的提问来源于stack exchange,提问作者Phoenix
相关产品推荐
相关产品推荐

