使用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
相关产品推荐
相关产品推荐

