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

Docker容器中NodeJS连接SQL Server报错求助

NodeJS后端容器连接SQL Server时出现SyntaxError问题排查

环境配置文件

docker-compose.yml

version: "3.7"
services:
sql-server-db:
container_name: sql-server-db
image: mcr.microsoft.com/mssql/server:2022-latest
ports:
  - "1433:1433"
environment:
  SA_PASSWORD: "super_duper_password"
  ACCEPT_EULA: "Y"
backend:
container_name: backend
build: .
depends_on: [sql-server-db]
ports:
  - "1434:1434"
environment:
  - DATABASE_PUBLIC_URL=sql-server-db
links: 
  - sql-server-db
frontend:
container_name: frontend
image: node:18
ports:
  - "3306:3306"
working_dir: /app/frontend
volumes:
  - ./frontend:/app
command: npm start

Dockerfile

FROM node:8.11.1
WORKDIR /app
COPY package.json /app
RUN npm install
COPY . /app
CMD ["npm", "start"]

报错信息

执行docker compose up后触发如下错误:

/app/node_modules/mssql/node_modules/tedious/lib/connection.js:2438
    for await (const data of message) {
        ^^^^^

SyntaxError: Unexpected reserved word
at new Script (vm.js:51:7)
at createScript (vm.js:136:10)
at Object.runInThisContext (vm.js:197:10)
at Module._compile (internal/modules/cjs/loader.js:618:28)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:665:10)
at Module.load (internal/modules/cjs/loader.js:566:32)
at tryModuleLoad (internal/modules/cjs/loader.js:506:12)
at Function.Module._load (internal/modules/cjs/loader.js:498:3)
at Module.require (internal/modules/cjs/loader.js:598:17)
at require (internal/modules/cjs/helpers.js:11:18)
npm ERR! code ELIFECYCLE
npm ERR! errno 1

后端index.js代码

var express = require('express');
var router = express.Router();
var sql = require('mssql');
const app = express();
const port = 3306;

const config = {
  user: 'sa',
  password: 'super_duper_password',
  server: 'localhost',
  database: 'testdb',
  options: {
    enableArithAbort: true,
    encrypt: false,
    trustServerCertificate: true,
    trustedConnection: true,
  }
}

const run = async () => {
  let pool;
  try {
    console.log('Connection opening...')
    pool = await sql.connect(config)
    const { recordset } = await sql.query('select * from users')
    console.log(recordset);
  } catch (err) {
    console.log(err)
  } finally {
    await pool.close()
    console.log('Connection closed.')
  }
}

run();

问题分析与解决方案

核心问题

错误指向for await...of语法,这是ES2018引入的特性,而后端使用的Node.js 8.11.1版本完全不支持该语法(Node.js从10.x版本开始才稳定支持for await...of)。老旧的Node.js版本无法兼容最新版mssql依赖的tedious库,因此加载依赖时直接触发语法错误。

解决步骤

  1. 升级后端Node.js版本
    修改Dockerfile中的基础镜像为支持目标语法的版本,建议使用和前端一致的node:18,或至少选择Node.js 14+的LTS版本:
FROM node:18
WORKDIR /app
COPY package.json /app
RUN npm install
COPY . /app
CMD ["npm", "start"]
  1. 修正数据库连接配置
    容器间通过服务名通信,不能用localhost连接SQL Server,同时关闭无效的Windows认证配置:
const config = {
  user: 'sa',
  password: 'super_duper_password',
  server: 'sql-server-db', // 替换localhost为docker-compose服务名
  database: 'testdb',
  options: {
    enableArithAbort: true,
    encrypt: false,
    trustServerCertificate: true,
    trustedConnection: false, // 关闭Windows认证,使用SQL账号密码登录
  }
}
  1. 修复端口冲突
    前端容器映射的3306是MySQL默认端口,且和后端代码中设置的端口冲突,建议调整为React默认端口3000,同时修正后端端口:
  • 修改docker-compose.yml中前端端口:- "3000:3000"
  • 修改index.js中的端口:const port = 1434;
  1. 重新构建启动
    执行命令清理旧容器、重新构建后端镜像并启动服务:
docker compose down
docker compose build --no-cache backend
docker compose up

内容的提问来源于stack exchange,提问作者François

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 14:39:16