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

Node.js+Express连接SQL Server失败问题排查求助

问题描述

使用Node.js + Express.js搭建支持CRUD操作的API,连接采用Windows身份认证的SQL Server时出现连接失败错误,错误提示包含主机未知、登录超时等信息。

相关代码

dbConfig.js

const sql = require('mssql/msnodesqlv8')

const config = {
    database: 'ApiDemoDB',
    server: '.',
    driver: 'msnodesqlv8',
    options: {
      trustedConnection: true
    }
}

const poolPromise = new sql.ConnectionPool(config)
.connect()
.then(pool => {
    console.log('Connected to MSSQL')
    return pool
})
.catch(err => console.log('Database Connection Failed! Bad Config!:  ', err))

module.exports = {
    sql, poolPromise
}

server.js

const express = require('express')

const bodyParser = require('body-parser')
const cors = require('cors')
const fs = require('fs')
const path = require('path')
const morgan = require('morgan')
const db=require('./db/dbConfig');

const app = express()

app.use(cors())

app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())

app.use(morgan('dev'))

app.use(db.poolPromise, (req, res)=>
{
    console.log('Database connection successful with config! ');
    res.json('Database connection successful with config! ');
})

const port = 3500

app.listen(process.env.PORT || port , (err) => {
  if(err)
  {
    console.log('Unable to start the server!')
  }
  else
    console.log('NodeExpress Data API started running on : ' + port)
})

详细错误信息

ConnectionError: Error: [Microsoft][SQL Server Native Client 11.0]TCP Provider: No such host is known.
,Error: [Microsoft][SQL Server Native Client 11.0]Login timeout expired,Error: [Microsoft][SQL Server Native Client
11.0]A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections.

解决方案

一、代码问题修正

1. 数据库连接配置优化

server: '.' 可能无法正确识别SQL Server实例,建议替换为具体实例名(默认Express实例为localhost\SQLEXPRESS),同时添加证书信任选项避免本地开发的证书错误:

修改后的dbConfig.js:

const sql = require('mssql/msnodesqlv8')

const config = {
    database: 'ApiDemoDB',
    server: 'localhost\\SQLEXPRESS', // 替换为你的SQL Server实例名
    driver: 'msnodesqlv8',
    options: {
        trustedConnection: true,
        trustServerCertificate: true // 本地开发环境可添加,跳过证书验证
    }
}

const poolPromise = new sql.ConnectionPool(config)
.connect()
.then(pool => {
    console.log('Connected to MSSQL')
    return pool
})
.catch(err => {
    console.error('Database Connection Failed! Bad Config!: ', err)
    process.exit(1) // 连接失败直接终止进程,避免服务启动后无法操作数据库
})

module.exports = { sql, poolPromise }

2. Express中间件错误修复

原代码中app.use(db.poolPromise, ...)错误,poolPromise是Promise对象,不能直接作为Express中间件使用。正确做法是等待连接池初始化完成后再启动服务,并在路由中使用连接池:

修改后的server.js:

const express = require('express')
const bodyParser = require('body-parser')
const cors = require('cors')
const morgan = require('morgan')
const { poolPromise } = require('./db/dbConfig')

const app = express()

app.use(cors())
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
app.use(morgan('dev'))

// 测试连接的示例路由
app.get('/test-db', async (req, res) => {
    try {
        const pool = await poolPromise
        const result = await pool.request().query('SELECT 1 AS TestResult')
        res.json({ success: true, data: result.recordset })
    } catch (err) {
        res.status(500).json({ success: false, error: err.message })
    }
})

const port = 3500

// 确保数据库连接成功后再启动服务器
poolPromise.then(() => {
    app.listen(process.env.PORT || port, () => {
        console.log('NodeExpress Data API started running on : ' + port)
    })
}).catch(err => {
    console.error('Failed to start server: Database connection error', err)
})

二、SQL Server实例配置检查

  • 确认服务运行状态:打开服务(services.msc),找到SQL Server(你的实例名),确保状态为正在运行。
  • 启用TCP/IP协议:打开SQL Server配置管理器,展开SQL Server网络配置 -> 你的实例的协议,启用TCP/IP。右键TCP/IP -> 属性,在IP地址标签中,设置IPALL的TCP端口为1433(默认),并确保所有IP的活跃状态为是。
  • 验证身份认证模式:在SQL Server Management Studio中,右键服务器 -> 属性 -> 安全性,确认服务器身份验证为Windows身份验证模式。
  • 检查防火墙规则:本地开发需确保防火墙未阻止SQL Server端口(默认1433);远程连接需在防火墙中添加允许该端口的入站规则。
  • 确认数据库存在:确保ApiDemoDB数据库已在目标SQL Server实例中创建。

三、依赖安装验证

确保已正确安装所有依赖包,执行以下命令:

npm install express mssql msnodesqlv8 body-parser cors morgan

注意:msnodesqlv8依赖本地ODBC驱动,若缺少需安装微软官方的ODBC Driver for SQL Server(本地开发推荐安装最新版本)。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 02:05:26