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

如何解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 23:20:38