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库,因此加载依赖时直接触发语法错误。
解决步骤
- 升级后端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"]
- 修正数据库连接配置
容器间通过服务名通信,不能用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账号密码登录 } }
- 修复端口冲突
前端容器映射的3306是MySQL默认端口,且和后端代码中设置的端口冲突,建议调整为React默认端口3000,同时修正后端端口:
- 修改docker-compose.yml中前端端口:
- "3000:3000" - 修改index.js中的端口:
const port = 1434;
- 重新构建启动
执行命令清理旧容器、重新构建后端镜像并启动服务:
docker compose down docker compose build --no-cache backend docker compose up
内容的提问来源于stack exchange,提问作者François
相关产品推荐
相关产品推荐

