Omar_Osman
Advocate I
2 years agoStatus:
Investigating
ERROR - Connect to SQL Endpoint using Node.js and tedious npm package.
Unsuccessful connect to SQL Endpoint using Node.js and tedious or mssql npm package Software versions tedious: "^17.0.0" Node.js:18.17.1 var Connection = require("tedious").Connection...
erz1234
2 years agoRegular Visitor
Hi, I have the same issue here. If I connect with python, connection establishes:
# db_connect.py
import os
import pyodbc
import struct
from azure.identity import ClientSecretCredential
def main():
client_secret = os.environ["AZURE_APP_SECRET"]
tenant_id = os.environ["AZURE_TENANT"]
client_id = os.environ["AZURE_APP_CLIENT_ID"]
database_server_name = os.environ["DB_SERVER"]
database_name = os.environ["DB_NAME"]
connection_string = f"Driver={{ODBC Driver 17 for SQL Server}};Server={database_server_name};Database={database_name};Port=1433;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30"
try:
credential = ClientSecretCredential(
tenant_id=tenant_id,
client_id=client_id,
client_secret=client_secret
)
token_bytes = credential.get_token("https://database.windows.net/.default").token.encode("UTF-16-LE")
token_struct = struct.pack(f'<I{len(token_bytes)}s', len(token_bytes), token_bytes)
SQL_COPT_SS_ACCESS_TOKEN = 1256 # This connection option is defined by Microsoft in msodbcsql.h
conn = pyodbc.connect(connection_string, attrs_before={SQL_COPT_SS_ACCESS_TOKEN: token_struct})
cursor = conn.cursor()
cursor.execute("SELECT 1 AS number")
row = cursor.fetchone()
print(f"Query result: {row[0]}")
except Exception as e:
print(f"Error: {e}")
if __name__ == "__main__":
main()
If I try to connect with NodeJS, socket hangs up. I tried to use mssql library, used token and service principal for authentication, tried a lot of different code variants. Same error always. Latest code change was, I tried to replicate your code, and the issue still exists:
import * as dotenv from 'dotenv';
var Connection = require("tedious").Connection;
dotenv.config();
const tenantId = process.env.AZURE_TENANT || '';
const clientId = process.env.AZURE_APP_CLIENT_ID || '';
const clientSecret = process.env.AZURE_APP_SECRET || '';
const dbServer = process.env.DB_SERVER || ''; // <server_name>.datawarehouse.fabric.microsoft.com
if (!tenantId || !clientId || !clientSecret || !dbServer || !database) {
throw new Error("Missing required environment variables");
}
async function connectToDatabase() {
const config = {
server: dbServer,
database: database,
options: {
encrypt: true,
trustServerCertificate: true,
connectTimeout: 30000,
requestTimeout: 30000,
enableArithAbort: true
},
authentication: {
type: 'azure-active-directory-service-principal-secret',
options: {
tenantId: tenantId,
clientId: clientId,
clientSecret: clientSecret
}
}
};
var connection = new Connection(config);
connection.connect((err : any) => {
if (err) {
console.log("Connection Failed");
throw err;
}
console.log("Custom connection Succeeded");
connection.close();
});
}
connectToDatabase();
It seems that the problem is with tedious library (or mssql library, which uses tedious under the hood if I remember correctly). It seems that only solution for me now is to call my python script from within my nodejs service, but would rather avoid this for now. I don' know what can I do at the moment, since I can imagine that the problem is within the imported libraries...