如何解决Node.js连接MSSQL时出现的ConnectionError: Connection is closed错误
SQL Server连接报错ECONNCLOSED的解决方法
问题描述
每次尝试运行服务器并从数据库获取结果时,都会收到以下错误信息:
ConnectionError: Connection is closed. ... code: 'ECONNCLOSED'找不到解决办法,请问我的JS文件中是否遗漏了某些内容?
原connection.js代码
const sql = require('mssql/msnodesqlv8'); const dbSettings = { user: '******', password: '******', server: "DESKTOP-*****\\SQLEXPRESS", database: 'webstore', driver: 'msnodesqlv8', options: { encrypt: true, // for azure } } export async function getConnection() { try { const pool = await sql.connect(dbSettings, function(err) { if(err) { console.log(err); } }); return pool; } catch (error) { console.log(error); } }
原products.controller.js代码
import {getConnection} from '../database/connection'; export const getProducts = async (req, res) => { const pool = await getConnection(); const result = await pool.request().query('SELECT * FROM Products'); console.log(result); res.json('products'); };
问题分析与修复
你的代码存在三个关键问题:
- 混合使用async/await与回调函数:
sql.connect本身返回Promise,不需要额外传入回调。同时用await和回调会导致连接逻辑混乱,可能连接未建立完成就返回pool,或者回调中的错误无法被try/catch捕获。 - encrypt选项配置错误:你使用的是本地SQL Server Express,而非Azure数据库,设置
encrypt: true会导致连接失败——本地SQL Server默认不启用加密连接。 - 错误处理不完整:
getConnection的catch块仅打印错误但未抛出,导致连接失败时返回undefined,后续调用pool.request()会触发新的错误。
修正后的connection.js
const sql = require('mssql/msnodesqlv8'); const dbSettings = { user: '******', password: '******', server: "DESKTOP-*****\\SQLEXPRESS", database: 'webstore', driver: 'msnodesqlv8', options: { encrypt: false, // 本地SQL Server无需加密,Azure环境才设为true trustServerCertificate: true // 可选,本地环境添加可避免证书验证警告 } } export async function getConnection() { try { // 移除回调,直接用await处理Promise const pool = await sql.connect(dbSettings); return pool; } catch (error) { console.error('数据库连接失败:', error); // 抛出错误让上层控制器处理,避免返回undefined throw error; } }
修正后的products.controller.js
import {getConnection} from '../database/connection'; export const getProducts = async (req, res) => { try { const pool = await getConnection(); const result = await pool.request().query('SELECT * FROM Products'); console.log(result); // 返回实际查询到的产品数据,而非固定字符串 res.json(result.recordset); } catch (error) { console.error('获取产品失败:', error); // 给前端返回错误状态码和信息 res.status(500).json({ message: '数据库查询失败', error: error.message }); } };
内容的提问来源于stack exchange,提问作者MaJunior
相关产品推荐
相关产品推荐

