sequelize connection timeout with cloud sql proxy in node.js - node.js

Running a local config, the connection works fine. I've installed and have a cloud_sql_proxy running and ready for new connections.
Here's my sequelize connection code:
const sequelize = new Sequelize(DB_NAME, DB_USER, DB_PASS, {
dialect: 'mysql',
host: `/cloudsql/${CLOUD_SQL_CONNECTION_NAME}`,
pool: {
max: 30,
min: 0,
idle: 10000,
acquire: 1000000,
},
dialectOptions: {
connectTimeout: 100000
}
});
At some point I set my max connection, acquire, and connectTimeout variables to absurdly high numbers, but still no luck, but I started getting a specific IP address located in London on port 3306.

I was able to connect to the cloud db by modifying my config to the following:
const sequelize = new Sequelize(DB_NAME, DB_USER, DB_PASS, {
dialect: 'mysql',
host: DB_HOST,
timestamps: false,
pool: {
max: 5,
min: 0,
idle: 10000
},
});
The difference is I pointed the host to the actual db IP address instead of the /cloudsql/${CLOUD_SQL_CONNECTION_NAME} path.

Related

Setting the timeout with Knex.js for MSSQL

I use knex.js in a node environment to run a web server that makes sql calls. I have a query that takes over 30 seconds to complete, but when it's run through knex, the default timeout seems to be 15 seconds, so I get the following timeout error:
RequestError: Timeout: Request failed to complete in 15000ms
...
How do I change the timeout for mssql queries? The official doc has an example of setting timeout on a specific query with .timeout() but this feature doesn't work with mssql. I've also tried everything in this github issue without any luck. After trying all of that, I have this messy looking connection config:
const connection = require('knex')({
client: 'mssql',
connection: {
host : process.env.NODE_ENV == 'production' ? '172.18.1.66' : 'localhost',
user : secrets.user,
password : secrets.password,
database : 'EdgeView',
dialect: "mssql",
options: {
'enableArithAbort': true,
'requestTimeout': 150000,
'idleTimeoutMillis': 150000
},
pool: {
max: 10,
min: 0,
idleTimeoutMillis: 150000
},
dialectOptions:{
requestTimeout: 300000,
options: {
"requestTimeout": 300000
}
}
}
});
The error did not change, none of these timeout values seems to have had an impact.
The query it's self is just a raw query:
let res = connection.raw(GETSQLSTRING(args));
The answer was simply this:
const connection = require('knex')({
client: 'mssql',
connection: {
host : 'edge-sql',
user : secrets.user,
password : secrets.password,
requestTimeout: 600000,
database : 'EdgeView'
}
});
Thanks to BGPHiJACK for pointing me towards better documentation.

Failed to connect to *name_server* - getaddrinfo ENOTFOUND

When connecting to the database with sequelize-typescript, an error occurs
Failed to connect to SERVER\SQL2016:1433 - getaddrinfo ENOTFOUND SERVER\SQL2016
Connection settings
import { Sequelize } from 'sequelize-typescript'
import { environment } from '../config'
import { normalize, join } from 'path'
export default new Sequelize({
database: environment.database.database,
dialect: "mssql",
username: environment.database.username,
// port: environment.database.port,
password: environment.database.password,
host: environment.database.host,
logging: !environment.production ? console.log : false,
models: [normalize(join(__dirname, "..", "models"))],
dialectOptions: {
options: {
enableArithAbort: true,
cryptoCredentialsDetails: {
minVersion: "TLSv1",
},
},
},
})
interface DatabaseConnection {
database: string
username: string
port: number
password: string
host: string
hostAsodu: string
databaseAsodu: string
}
export const environment: Environment = {
port: process.env.PORT ? Number(process.env.PORT) : 3030,
production: process.env.NODE_ENV === "production",
database: {
database: process.env.DB_DATABASE ?? String(),
username: process.env.DB_USERNAME ?? String(),
port: process.env.DB_PORT ? Number(process.env.DB_PORT) : 0,
password: process.env.DB_PASSWORD ?? String(),
host: process.env.DB_HOST ?? String(),
hostAsodu: process.env.DB_HOST_ASODU ?? String(),
databaseAsodu: process.env.DB_DATABASE_ASODU ?? String()
},
}
I tried connectit with and without a port, the error is the same. It just connects to SERVER, but does not want to connect to the named SERVER \ SQL2016. How can I fix this error? Found nothing on the docks
ENOTFOUND is an operating-system-level error from your OS's networking code. It means you asked it to look up a hostname and it came up with nothing. In the lingo, your name "could not be resolved." (www.stackoverflow.com is a hostname, for example. https://www.stackoverflow.com is a URL, which happens to contain a hostname.)
getaddrinfo() is OS method that asks the domain name service (DNS) to look up a hostname.
It looks to me like you tried to look up the hostname SERVER\SQL2016. That's not a hostname. You probably want something like sql2016.example.com instead. Ask the person who operates that SQL Server instance for the correct hosthame.
The SQL Server instance I use has a hostname something like devdatabase.dev.example.com.
Edit The SQL2016 part of your connection string is known as the server instance or DataSource. You need to specify it separately from the hostname. See this. Error connecting to SQL Server database with sequelize You also need to make sure your SQL Server software is configured to allow TCP connections.
Try this as you connect.
export default new Sequelize({
database: environment.database.database,
dialect: "mssql",
username: environment.database.username,
// port: environment.database.port,
password: environment.database.password,
host: environment.database.host, /* should be the hostname without \SQL2016 */
logging: !environment.production ? console.log : false,
models: [normalize(join(__dirname, "..", "models"))],
dialectOptions: {
instanceName: 'SQL2016',
options: {
enableArithAbort: true,
cryptoCredentialsDetails: {
minVersion: "TLSv1",
},
},
},
})

Sequelize connection to AWS RDS SQL Express Database in AWS Beanstalk

I have an elastic beanstalk website and a separate RDS database (SQL Express). When I ssh into the beanstalk instance, I can connect to the database on the server so the security groups are setup up correctly. However, when I use sequelize in my app, I cannot connect to the database.
I receive the below error in sequelize:
[SequelizeConnectionError]: Failed to lookup instance on web.cluster-qwertyuiop.us-west-2.rds.amazonaws.com - getaddrinfo ENOTFOUND web.cluster-qwertyuiop.us-west-2.rds.amazonaws.com
at ConnectionManager.connect (/var/app/current/node_modules/sequelize/lib/dialects/mssql/connection-manager.js:145:17) {
parent: ConnectionError: Failed to lookup instance on web.cluster-qwertyuiop.us-west-2.rds.amazonaws.com - getaddrinfo ENOTFOUND web.cluster-qwertyuiop.us-west-2.rds.amazonaws.com
at ConnectionError (/var/app/current/node_modules/tedious/lib/errors.js:13:12)
at /var/app/current/node_modules/tedious/lib/connection.js:1077:60
at /var/app/current/node_modules/tedious/lib/instance-lookup.js:116:20
at GetAddrInfoReqWrap.callback (/var/app/current/node_modules/tedious/lib/sender.js:140:16)
at GetAddrInfoReqWrap.onlookupall [as oncomplete] (dns.js:74:17) {
code: 'EINSTLOOKUP'
},
This is my connection string:
new Sequelize('DATABASE', username, password, {
dialect: 'mssql',
dialectOptions: {
requestTimeout: 300000,
options: {
driver: 'SQL Server Native Client 11.0',
instanceName: 'SQLEXPRESS',
trustedConnection: true,
},
},
logging: false,
port: 1433,
host: 'web.cluster-qwertyuiop.us-west-2.rds.amazonaws.com',
pool: {
max: 20,
min: 3,
idle: 20000,
evict: 0,
acquire: 20000,
handleDisconnects: true,
},
There's very little to find online when trying to connect to MS SQL instances. I've been stuck on this one for a few days now.

Nodejs mssql server connection throws an error

I want to connect my mssql database from nodejs.
I am using sequelize and tedious module for this.
My connection configs like this
const sequelize = new Sequelize(
"mydb",
"username", "password", {
host:config_data.host,
"dialect":"mssql",
"port":1433
dialectOptions: {
instanceName: "MSSQLSERVER"
},
},
);
When I tried to run script, it throws an error.
(node:14584) UnhandledPromiseRejectionWarning: SequelizeConnectionError: Failed to connect to 192.168.10.220:1433 - Could not connect (sequence)
I apply all steps in configuration manager.
Enabled TCP/IP
Started Server SQL browser
Added 1433 port to Firewall
There is also additional error when host is "localhost".(Currently writed IP address)
(node:13552) UnhandledPromiseRejectionWarning: SequelizeConnectionError: Failed to connect to localhost:1433
- 4292:error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol:c:\ws\deps\openssl\openssl\ssl\statem\statem_lib.c:1947:
I need to help, is there someone have any idea ?
You need to set encrypt to false in your Sequelize inside options.
const sequelize = new Sequelize(
"mydb",
"username", "password", {
host:config_data.host,
"dialect":"mssql",
"port":1433,
"options": {
encrypt: false,
enableArithAbort: false
},
dialectOptions: {
instanceName: "MSSQLSERVER"
},
},
);
The issue is because of TLS protocol mismatch between Source & Destination server. In my case my App server was Ubuntu 20.04 & my SQL Server(Express 2012) was on Windows server. I also tried to downgrade TLS protocols on Ubuntu but nothing worked. So finally I disabled tls encryption in Sequelize.
Make sure options are given as expected by Sequelize
const sequelize = new Sequelize(dbConfig.DB, dbConfig.USER, dbConfig.PASSWORD, {
host: dbConfig.HOST,
port: dbConfig.PORT,
dialect: dbConfig.dialect,
pool: {
max: dbConfig.pool.max,
min: dbConfig.pool.min,
acquire: dbConfig.pool.acquire,
idle: dbConfig.pool.idle,
},
// The below options are important to supress ssl issue on
// AWS EC2 ubuntu when db server is on windows. There is TLS protocol issue
// Which by using these options we disable tls encryption
dialectOptions: {
// Observe the need for this nested `options` field for MSSQL
options: {
encrypt: false,
enableArithAbort: false
}
}
});

SQL Server host not found error with sequelize

I am trying to use SQL Server with node.js using sequelize orm. But I keep getting host not found error:
HostNotFoundError [SequelizeHostNotFoundError]: Failed to connect to
localhost//SQLEXPRESS:1433 - getaddrinfo ENOTFOUND localhost//SQLEXPRESS
Failed to connect to localhost//SQLEXPRESS:1433 - getaddrinfo ENOTFOUND localhost//SQLEXPRESS', code: 'ESOCKET
Code:
var db = new Sequelize('test', 'root', 'secret', {
host: 'localhost\\SQLEXPRESS',
dialect: 'mssql',
pool: {
max: 5,
min: 0,
idle: 10000
},
});
db.authenticate()
.then(()=>console.log('Database connected'))
.catch(err=> console.log(err))
Please help me!
trying
options.port The port of the relational database.
var db = new Sequelize('test', 'root', 'secret', {
host: 'localhost\\SQLEXPRESS',
dialect: 'mssql',
pool: {
max: 5,
min: 0,
idle: 10000
},
port:56198,
});

Resources