从部署在Google云应用引擎中的节点js应用程序查询时,Cloud SQL会抛出ETIMEDOUT错误

时间:2018-01-23 00:54:10

标签: node.js google-app-engine google-cloud-platform google-cloud-sql

我正在使用cloud sql作为数据库的节点js应用程序。我在我的本地主机上开发了应用程序并部署到谷歌云应用程序引擎。在app引擎中,我收到了下面提到的错误。 注意:我验证了数据库凭据是否正确。尝试了许多事情,包括增加连接超时,但同样的错误仍然存​​在。

A {错误:连接ETIMEDOUT     在Connection._handleConnectTimeout(/app/node_modules/mysql/lib/Connection.js:419:13)     at Object.onceWrapper(events.js:313:30)     在emitNone(events.js:106:13)     在Socket.emit(events.js:208:7)     在Socket._onTimeout(net.js:407:8)     在ontimeout(timers.js:475:11)     在tryOnTimeout(timers.js:310:5)     在Timer.listOnTimeout(timers.js:270:5)

A --------------------

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 at at。 (/app/code/nodejs/app.js:27:9)

A在Module._compile(module.js:643:30)

A at Object.Module._extensions..js(module.js:654:10)

A在Module.load(module.js:556:32)

在tryModuleLoad(module.js:499:12)

错误号码:'ETIMEDOUT',

代码:'ETIMEDOUT',

系统调用:'connect',

致命:真实}

1 个答案:

答案 0 :(得分:1)

应将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)应启用Cloud SQL API

2)在app.yaml中,应在beta_settings部分添加cloud_sql_instances

beta_settings:
  cloud_sql_instances: YOUR_INSTANCE_CONNECTION_NAME

如果未提供,则会在PipeConnectWrap.afterConnect [as]处的_exceptionWithHostPort(util.js:1044:20)处生成错误(错误:在Object._errnoException(util.js:1022:11)处连接ENOENT instance_name) oncomplete](net.js:1182:14))