尝试从云功能连接到 Cloud-sql sql-server 时出现连接错误
Connection error when trying to connect to Cloud-sql sql-server from cloud-functions
我正在使用 firebase 函数连接到云-sql(Microsoft SQL 服务器)。我尝试了以下通过 public ip:
连接到 SQL 服务器
/*Tedious Start*/
var TediousConnection = require('tedious').Connection;
var TediousRequest = require('tedious').Request;
var TediousTypes = require('tedious').TYPES;
const config = {
user: 'admin',
password: 'password',
server: '12.345.5.678',
database: 'mma',
//host: 'myproject:us-central1:my-db'
};
app.get('/mssql/', async(req, res) => {
var sql = require('mssql');
sql
.connect(config)
.then(function() {
//6.
var request = new sql.Request();
//7.
request
.query('SET NOCOUNT ON;select * from student')
.then(function(recordset) {
// send records as a response
res.send(recordset.recordset);
sql.close();
})
.catch(function(err) {
//8.
console.log(err);
sql.close();
});
res.end();
})
.catch(function(err) {
//9.
console.log(err);
});
});
我收到以下错误:
{ ConnectionError: Failed to connect to 12.345.5.678:1433 in 15000ms
at Connection.tedious.once.err (/srv/node_modules/mssql/lib/tedious/connection-pool.js:68:17)
at Object.onceWrapper (events.js:315:30)
at emitOne (events.js:116:13)
at Connection.emit (events.js:211:7)
at Connection.connectTimeout (/srv/node_modules/mssql/node_modules/tedious/lib/connection.js:1195:10)
at Timeout.connectTimer.setTimeout [as _onTimeout] (/srv/node_modules/mssql/node_modules/tedious/lib/connection.js:1157:12)
at ontimeout (timers.js:498:11)
at tryOnTimeout (timers.js:323:5)
at Timer.listOnTimeout (timers.js:290:5)
code: 'ETIMEOUT',
originalError:
{ ConnectionError: Failed to connect to 12.345.5.678:1433 in 15000ms
at ConnectionError (/srv/node_modules/mssql/node_modules/tedious/lib/errors.js:13:12)
at Connection.connectTimeout (/srv/node_modules/mssql/node_modules/tedious/lib/connection.js:1195:54)
at Timeout.connectTimer.setTimeout [as _onTimeout] (/srv/node_modules/mssql/node_modules/tedious/lib/connection.js:1157:12)
at ontimeout (timers.js:498:11)
at tryOnTimeout (timers.js:323:5)
at Timer.listOnTimeout (timers.js:290:5)
message: 'Failed to connect to 12.345.5.678:1433 in 15000ms',
code: 'ETIMEOUT' },
name: 'ConnectionError' }
我认为 cloudfunction 无法访问 sql 服务器。我还尝试添加服务帐户以获得云sql 权限。
我认为我的云函数有问题,并尝试使用云函数中的 cloudsql-postgresql。我能够从云功能成功连接到 ClouSQL-postgresql。
例如,在云sql-postgresql 的情况下,主机使用 unix 域套接字采用类似于以下的值:
config.host = `/cloudsql/${process.env.CLOUD_SQL_CONNECTION_NAME}`;
如果是 Cloudsql-mssql,我将提供服务器的 IP 地址。我不知道我错过了什么。我需要处理防火墙问题吗?
根据 documentation:
Cloud Functions does not support connecting to Cloud SQL for SQL
Server over public IP. Use private IP instead
相反,您应该使用实例的专用 IP 地址和端口 1433 直接连接。
我正在使用 firebase 函数连接到云-sql(Microsoft SQL 服务器)。我尝试了以下通过 public ip:
连接到 SQL 服务器/*Tedious Start*/
var TediousConnection = require('tedious').Connection;
var TediousRequest = require('tedious').Request;
var TediousTypes = require('tedious').TYPES;
const config = {
user: 'admin',
password: 'password',
server: '12.345.5.678',
database: 'mma',
//host: 'myproject:us-central1:my-db'
};
app.get('/mssql/', async(req, res) => {
var sql = require('mssql');
sql
.connect(config)
.then(function() {
//6.
var request = new sql.Request();
//7.
request
.query('SET NOCOUNT ON;select * from student')
.then(function(recordset) {
// send records as a response
res.send(recordset.recordset);
sql.close();
})
.catch(function(err) {
//8.
console.log(err);
sql.close();
});
res.end();
})
.catch(function(err) {
//9.
console.log(err);
});
});
我收到以下错误:
{ ConnectionError: Failed to connect to 12.345.5.678:1433 in 15000ms
at Connection.tedious.once.err (/srv/node_modules/mssql/lib/tedious/connection-pool.js:68:17)
at Object.onceWrapper (events.js:315:30)
at emitOne (events.js:116:13)
at Connection.emit (events.js:211:7)
at Connection.connectTimeout (/srv/node_modules/mssql/node_modules/tedious/lib/connection.js:1195:10)
at Timeout.connectTimer.setTimeout [as _onTimeout] (/srv/node_modules/mssql/node_modules/tedious/lib/connection.js:1157:12)
at ontimeout (timers.js:498:11)
at tryOnTimeout (timers.js:323:5)
at Timer.listOnTimeout (timers.js:290:5)
code: 'ETIMEOUT',
originalError:
{ ConnectionError: Failed to connect to 12.345.5.678:1433 in 15000ms
at ConnectionError (/srv/node_modules/mssql/node_modules/tedious/lib/errors.js:13:12)
at Connection.connectTimeout (/srv/node_modules/mssql/node_modules/tedious/lib/connection.js:1195:54)
at Timeout.connectTimer.setTimeout [as _onTimeout] (/srv/node_modules/mssql/node_modules/tedious/lib/connection.js:1157:12)
at ontimeout (timers.js:498:11)
at tryOnTimeout (timers.js:323:5)
at Timer.listOnTimeout (timers.js:290:5)
message: 'Failed to connect to 12.345.5.678:1433 in 15000ms',
code: 'ETIMEOUT' },
name: 'ConnectionError' }
我认为 cloudfunction 无法访问 sql 服务器。我还尝试添加服务帐户以获得云sql 权限。
我认为我的云函数有问题,并尝试使用云函数中的 cloudsql-postgresql。我能够从云功能成功连接到 ClouSQL-postgresql。
例如,在云sql-postgresql 的情况下,主机使用 unix 域套接字采用类似于以下的值:
config.host = `/cloudsql/${process.env.CLOUD_SQL_CONNECTION_NAME}`;
如果是 Cloudsql-mssql,我将提供服务器的 IP 地址。我不知道我错过了什么。我需要处理防火墙问题吗?
根据 documentation:
Cloud Functions does not support connecting to Cloud SQL for SQL Server over public IP. Use private IP instead
相反,您应该使用实例的专用 IP 地址和端口 1433 直接连接。