Thomas
Thomas

Reputation: 21

Node TS API container is unable to connect with SQL Server

I’m trying to run a container from my backend application, but I can’t connect to my SQL Server (mssql), I get the following error:

ConnectionError: Failed to connect to = 192.168.0.190:1433 - getaddrinfo ENOTFOUND = 192.168.0.190 at connectListener (/app/node_modules/mssql/lib/tedious/connection-pool.js:70:17) at Connection.onConnect (/app/node_modules/tedious/src/connection.ts:1725:9) at Object.onceWrapper (node:events:629:26) at Connection.emit (node:events:514:28) at Connection.emit (/app/node_modules/tedious/src/connection.ts:1868:18) at Connection.socketError (/app/node_modules/tedious/src/connection.ts:2189:12) at /app/node_modules/tedious/src/connection.ts:1992:37 at processTicksAndRejections (node:internal/process/task_queues:77:11) { code: ‘ESOCKET’, originalError: ConnectionError: Failed to connect to = 192.168.0.190:1433 - getaddrinfo ENOTFOUND = 192.168.0.190 at Connection.socketError (/app/node_modules/tedious/src/connection.ts:2189:28) at /app/node_modules/tedious/src/connection.ts:1992:37 at processTicksAndRejections (node:internal/process/task_queues:77:11) { code: ‘ESOCKET’, isTransient: undefined } }

But when I run locally the error does not occur.

My Dockerfile:

FROM node:18-alpine
WORKDIR /app
COPY ./package*.json .
RUN npm install
COPY . .
ENV APP_DATA_BASE = *************
ENV API_HOST = 192.168.0.190
ENV INSTANCE_NAME = mssqlserver
ENV DB_PORT = 1433
ENV PORT = 8080
ENV DIALECT = *****
ENV DB_USER = *****
ENV PASSWORD = ******
ENV TLS_VERSION = *****
ENV SECRET= **********
ENV BI_DATABASE = ****
ENV BI_USER = ****
ENV BI_PASSWORD = *****
ENV BI_HOST = 192.168.0.190
ENV BI_PORT = 1433
EXPOSE 8080

My docker compose

version: ‘3.7’

services:
  cockpit-api:
    build:
      context: .
      dockerfile: Dockerfile
      # target: base
    volumes:
      - ./src:/usr/src/app
    container_name: cockpit-api
    expose:
      - '8080'
    ports:
      - '8080:8080'
    command: npm run dev

my App DataSource

import ‘reflect-metadata’
import ‘dotenv/config’
import { join } from ‘path’
import { DataSource } from ‘typeorm’

export const AppDataSource = new DataSource({
    type: 'mssql',
    host: process.env.API_HOST,
    port: Number(process.env.DB_PORT),
    username:  process.env.DB_USER,
    password: process.env.PASSWORD,
    database: process.env.APP_DATA_BASE,
    synchronize: false,
    logging: false,
    entities: [join(__dirname, './entities/*{.ts,.js}')],
    migrations: [join(__dirname, './migrations/*{.ts,.js}')],
    subscribers: [],
    extra: {
        encrypt: false,
        trustServerCertificate: true
    }
})

My serve.ts

import 'reflect-metadata'
import { AppDataSource } from '../infra/db/mssql/cockpit/datasource'
import mssql from 'mssql';
const sql = mssql
import app from './config/app'


export const biEmisConfig = {
    user: process.env.BI_USER,
    password: process.env.BI_PASSWORD,
    database: process.env.BI_DATABASE,
    server: process.env.BI_HOST || '',
    pool: {
        max: 10,
        min: 0,
        idleTimeoutMillis: 30000
    },
    options: {
        encrypt: false, // for azure
        trustServerCertificate: true, // change to true for local dev / self-signed certs
        port: Number(process.env.BI_PORT)
    }
}

AppDataSource.initialize()
    .then(async () => {
        console.log('App Data Source initilized')
        await sql.connect(biEmisConfig)
        console.log('Bi initialized')
        app.listen(process.env.PORT, () =>  {
            console.log(`Server is running on ${process.env.PORT}`)
        })
    })
    .catch(error => console.error(error))

My package.json

{
  "name": "cockpit-api",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "type": "commonjs",
  "scripts": {
    "start": "node build/main/server.js",
    "build": "rimraf build && tsc",
    "dev": "tsnd --transpile-only --respawn --ignore-watch node_modules src/main/server.ts",
    "test": "vitest",
    "coverage": "vitest run --coverage",
    "typeorm": "typeorm-ts-node-commonjs",
    "migration:generate": "typeorm-ts-node-commonjs migration:generate -d  src/infra/db/mssql/cockpit/datasource.ts",
    "migration:up": "typeorm-ts-node-commonjs migration:run -d  src/infra/db/mssql/cockpit/datasource.ts",
    "migration:down": "typeorm-ts-node-commonjs migration:revert -d  src/infra/db/mssql/cockpit/datasource.ts",
    "migration:create": "typeorm migration:create"
  }
  "dependencies": {
    "bcrypt": "^5.1.0",
    "dotenv": "^16.3.1",
    "express": "^4.18.2",
    "jsonwebtoken": "^9.0.0",
    "mssql": "^9.1.2",
    "reflect-metadata": "^0.1.13",
    "rimraf": "^5.0.1",
    "typeorm": "^0.3.17",
    "validator": "^13.9.0"
  },
  "devDependencies": {
    "@types/bcrypt": "^5.0.0",
    "@types/express": "^4.17.17",
    "@types/jsonwebtoken": "^9.0.2",
    "@types/mssql": "^8.1.2",
    "@types/node": "^20.3.2",
    "@types/validator": "^13.7.17",
    "@typescript-eslint/eslint-plugin": "^5.60.0",
    "@typescript-eslint/parser": "^5.60.0",
    "@vitest/coverage-v8": "^0.32.2",
    "eslint": "^8.43.0",
    "eslint-config-standard-with-typescript": "^35.0.0",
    "eslint-plugin-import": "^2.27.5",
    "eslint-plugin-promise": "^6.1.1",
    "prettier": "^2.8.8",
    "ts-node": "^10.9.1",
    "ts-node-dev": "^2.0.0",
    "typescript": "^5.1.3",
    "vitest": "^0.32.2"
  }
}

What am I doing wrong?

I tried to change the host

Upvotes: 0

Views: 153

Answers (1)

Thomas
Thomas

Reputation: 21

As David commented above , I was adding an extra space after the '=' in my environment variables. After removing the extra space it worked.

So, the wrong way:

ENV API_HOST = 192.168.0.190

And the right way:

ENV API_HOST=192.168.0.190

Upvotes: 0

Related Questions