我正在开发一个以云SQL为数据库的节点js应用程序。我在本地主机中开发了该应用程序,并部署到谷歌云应用引擎。在应用程序引擎中,我收到下面提到的错误。 注意:我已验证数据库凭据是否正确。尝试了许多方法,包括增加连接超时,但相同的错误仍然存在。
A { 错误:连接 ETIMEDOUT at Connection._handleConnectTimeout (/app/node_modules/mysql/lib/Connection.js:419:13) at Object.onceWrapper (events.js:313:30) at emitNone (events.js:106:13) at Socket.emit (events.js:208:7) 在Socket._onTimeout (净.js:407:8) 超时时(计时器.js:475:11) at tryOnTimeout (timers.js:310:5) at Timer.listOnTimeout (timers.js:270:5)
一个--------------------
A at Protocol._enqueue (/app/node_modules/mysql/lib/protocol/Protocol.js:145:48)
A at Protocol.handshake (/app/node_modules/mysql/lib/protocol/Protocol.js:52:23)
A at Connection.connect (/app/node_modules/mysql/lib/Connection.js:130:18)
A at Connection._implyConnect (/app/node_modules/mysql/lib/Connection.js:461:10)
A at Connection.query (/app/node_modules/mysql/lib/Connection.js:206:8)
a at 对象。(/app/code/nodejs/app.js:27:9)
A 在Module._compile(模块.js:643:30)
A 在 Object.Module._extensions..JS(模块.js:654:10)
A at Module.load (module.js:556:32)
A at tryModuleLoad (module.js:499:12)
错误没有:"ETIMEDOUT",
一个代码:"ETIMEDOUT",
系统调用:"连接",
致命的:真
}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
如果未提供,它将在 PipeConnectWrap.afterConnect [作为完成] (net.js:1182:14) Object._errnoException (util.js:1022:11) 在 _exceptionWithHostPort (util.js:1044:20) 生成错误 (错误:连接 ENOENT instance_name 在 PipeConnectWrap.afterConnect [作为完成] (net:1182:14))