从部署在 google 云应用引擎中的节点 js 应用程序查询时,云 SQL 抛出 ETIMEDOUT 错误
Cloud SQL is throwing ETIMEDOUT error when queried from node js application deployed in google cloud app engine
我正在开发一个以云 sql 作为数据库的节点 js 应用程序。我在本地主机上开发了应用程序并部署到 google 云应用引擎。在 App Engine 中,出现以下错误。
注意:我验证了数据库凭据是正确的。尝试了很多事情,包括增加连接超时,但同样的错误仍然存在。
A { 错误:连接 ETIMEDOUT
在 Connection._handleConnectTimeout (/app/node_modules/mysql/lib/Connection.js:419:13)
在 Object.onceWrapper (events.js:313:30)
在 emitNone (events.js:106:13)
在 Socket.emit (events.js:208:7)
在 Socket._onTimeout (net.js:407:8)
在超时 (timers.js:475:11)
在 tryOnTimeout (timers.js:310:5)
在 Timer.listOnTimeout (timers.js:270:5)
一个--------------------
A 在 Protocol._enqueue (/app/node_modules/mysql/lib/protocol/Protocol.js:145:48)
A 在 Protocol.handshake (/app/node_modules/mysql/lib/protocol/Protocol.js:52:23)
A 在 Connection.connect (/app/node_modules/mysql/lib/Connection.js:130:18)
A 在 Connection._implyConnect (/app/node_modules/mysql/lib/Connection.js:461:10)
A 在 Connection.query (/app/node_modules/mysql/lib/Connection.js:206:8)
A 在对象。 (/app/code/nodejs/app.js:27:9)
A 在 Module._compile (module.js:643:30)
A 在 Object.Module._extensions..js (module.js:654:10)
A 在 Module.load (module.js:556:32)
A 在 tryModuleLoad (module.js:499:12)
错误号:'ETIMEDOUT',
A码:'ETIMEDOUT',
一个系统调用:'connect',
致命一击:正确}
socketPath 应设置为“/cloudsql/{INSTANCE_CONNECTION_NAME}”以解决此问题(例如,socketPath 在本地计算机中不需要工作)。无需设置主机。示例代码片段如下
const knex = connect();
function connect () {
const config = {
user: process.env.SQL_USER,
password: process.env.SQL_PASSWORD,
database: process.env.SQL_DATABASE
};
if (process.env.INSTANCE_CONNECTION_NAME && process.env.NODE_ENV === 'production') {
config.socketPath = `/cloudsql/${process.env.INSTANCE_CONNECTION_NAME}`;
}
// Connect to the database
const knex = Knex({
client: 'mysql',
connection: config
});
return knex;
}
参考:https://cloud.google.com/appengine/docs/flexible/nodejs/using-cloud-sql
补充注意事项:
1) 应启用云 SQL API
2) 在app.yaml中,cloud_sql_instances应该添加到beta_settings部分
beta_settings:
cloud_sql_instances: YOUR_INSTANCE_CONNECTION_NAME
如果没有提供,会产生错误 (Error: connect ENOENT instance_name at Object._errnoException (util.js:1022:11) at _exceptionWithHostPort (util.js:1044:20) 在 PipeConnectWrap.afterConnect [完成时] (net.js:1182:14))
我正在开发一个以云 sql 作为数据库的节点 js 应用程序。我在本地主机上开发了应用程序并部署到 google 云应用引擎。在 App Engine 中,出现以下错误。 注意:我验证了数据库凭据是正确的。尝试了很多事情,包括增加连接超时,但同样的错误仍然存在。
A { 错误:连接 ETIMEDOUT 在 Connection._handleConnectTimeout (/app/node_modules/mysql/lib/Connection.js:419:13) 在 Object.onceWrapper (events.js:313:30) 在 emitNone (events.js:106:13) 在 Socket.emit (events.js:208:7) 在 Socket._onTimeout (net.js:407:8) 在超时 (timers.js:475:11) 在 tryOnTimeout (timers.js:310:5) 在 Timer.listOnTimeout (timers.js:270:5)
一个--------------------
A 在 Protocol._enqueue (/app/node_modules/mysql/lib/protocol/Protocol.js:145:48)
A 在 Protocol.handshake (/app/node_modules/mysql/lib/protocol/Protocol.js:52:23)
A 在 Connection.connect (/app/node_modules/mysql/lib/Connection.js:130:18)
A 在 Connection._implyConnect (/app/node_modules/mysql/lib/Connection.js:461:10)
A 在 Connection.query (/app/node_modules/mysql/lib/Connection.js:206:8)
A 在对象。 (/app/code/nodejs/app.js:27:9)
A 在 Module._compile (module.js:643:30)
A 在 Object.Module._extensions..js (module.js:654:10)
A 在 Module.load (module.js:556:32)
A 在 tryModuleLoad (module.js:499:12)
错误号:'ETIMEDOUT',
A码:'ETIMEDOUT',
一个系统调用:'connect',
致命一击:正确}
socketPath 应设置为“/cloudsql/{INSTANCE_CONNECTION_NAME}”以解决此问题(例如,socketPath 在本地计算机中不需要工作)。无需设置主机。示例代码片段如下
const knex = connect();
function connect () {
const config = {
user: process.env.SQL_USER,
password: process.env.SQL_PASSWORD,
database: process.env.SQL_DATABASE
};
if (process.env.INSTANCE_CONNECTION_NAME && process.env.NODE_ENV === 'production') {
config.socketPath = `/cloudsql/${process.env.INSTANCE_CONNECTION_NAME}`;
}
// Connect to the database
const knex = Knex({
client: 'mysql',
connection: config
});
return knex;
}
参考:https://cloud.google.com/appengine/docs/flexible/nodejs/using-cloud-sql
补充注意事项:
1) 应启用云 SQL API
2) 在app.yaml中,cloud_sql_instances应该添加到beta_settings部分
beta_settings:
cloud_sql_instances: YOUR_INSTANCE_CONNECTION_NAME
如果没有提供,会产生错误 (Error: connect ENOENT instance_name at Object._errnoException (util.js:1022:11) at _exceptionWithHostPort (util.js:1044:20) 在 PipeConnectWrap.afterConnect [完成时] (net.js:1182:14))