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

使用mssql连接Next.js与SQL Server时出现ConnectionError求助

Next.js 连接 SQL Server 出现 ConnectionError 问题

已启用TCP/IP协议,且SQL Server Browser服务处于运行状态,但使用mssql库连接时仍报错。

代码示例

db.js

// db.js
import sql from 'mssql'

// connection configs
const config = {
    user: 'test',
    password: '1000',
    server: '.\sqlexpress',
    database: 'DATABASE_NAME',
    port: 1433,
    options: {
        instancename: 'SQLEXPRESS',
        trustedconnection: true,
        trustServerCertificate: true
    },
}

export default async function ExcuteQuery(query, options) {
    try {
        let pool = await sql.connect(config);
        let products = await pool.request().query(query);
        return products.recordsets;
    }
    catch (error) {
        console.log(error);
    }
}

api/hello.js

// api/hello.js
import ExcuteQuery from '../../utils/db';

export default async function handler(req, res) {
  console.log(await ExcuteQuery('select * from tbl_category'));
  res.status(200).json({})
}

报错信息

ConnectionError: getaddrinfo ENOTFOUND .
    at E:\0 - WEB\pos\node_modules\mssql\lib\tedious\connection-pool.js:70:17
    at Connection.onConnect (E:\0 - WEB\pos\node_modules\tedious\lib\connection.js:1012:9)
    at Object.onceWrapper (node:events:628:26)
    at Connection.emit (node:events:513:28)
    at Connection.emit (E:\0 - WEB\pos\node_modules\tedious\lib\connection.js:1040:18)
    at E:\0 - WEB\pos\node_modules\tedious\lib\connection.js:1081:16       
    at process.processTicksAndRejections (node:internal/process/task_queues:77:11) {
  code: 'EINSTLOOKUP',
  originalError: ConnectionError: getaddrinfo ENOTFOUND .
      at E:\0 - WEB\pos\node_modules\tedious\lib\connection.js:1081:32     
      at process.processTicksAndRejections (node:internal/process/task_queues:77:11) {
    code: 'EINSTLOOKUP',
    isTransient: undefined
  }
}

已完成的配置

  • 启用SQL Server配置管理器中的TCP/IP协议
  • 配置TCP/IP的IP地址参数
  • 确认SQL Server Browser服务处于运行状态

问题分析与解决方案

1. 修复服务器地址转义错误

JS字符串中单个反斜杠是转义字符,'.\sqlexpress'会被解析为'.sqlexpress',导致无法识别正确的实例地址。需要将反斜杠双写:

server: '.\\sqlexpress'
// 或者改用localhost
server: 'localhost\\sqlexpress'

2. 统一身份验证方式

配置中同时设置了trustedconnection: true(Windows身份验证)和user/password(SQL Server身份验证),两者冲突:

  • 使用Windows身份验证:删除user和password字段,保留trustedconnection: true,确保当前运行Next.js的账户有SQL Server访问权限。
  • 使用SQL Server身份验证:将trustedconnection改为false,并确认SQL Server已启用混合身份验证模式,test用户存在且拥有目标数据库的访问权限。

3. 端口与实例名验证

  • 若SQL Server实例使用动态端口,可尝试删除port:1433配置,让mssql通过SQL Server Browser自动获取端口。
  • 确认instancename: 'SQLEXPRESS'与实际实例名称一致。

修改后的db.js示例(Windows身份验证)

// db.js
import sql from 'mssql'

const config = {
    server: '.\\sqlexpress',
    database: 'DATABASE_NAME',
    options: {
        instancename: 'SQLEXPRESS',
        trustedconnection: true,
        trustServerCertificate: true
    },
}

export default async function ExcuteQuery(query, options) {
    try {
        let pool = await sql.connect(config);
        let products = await pool.request().query(query);
        return products.recordsets;
    }
    catch (error) {
        console.error(error);
        throw error; // 抛出错误便于上层处理
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 03:25:28