ETIMEOUT错误|谷歌云SQL数据库与NodeJS
问题描述:
我已经在谷歌云上创建了一个mysql数据库,我想从一个单独的节点web应用程序(也在谷歌云上运行)访问。我首先在我的计算机上本地测试连接,并且在本地运行以下代码时,我可以成功建立与数据库的连接并查看其中的数据。ETIMEOUT错误|谷歌云SQL数据库与NodeJS
'use strict';
// [START app]
const express = require('express');
const bodyParser = require('body-parser');
const path = require('path');
const app = express();
const mysql = require('mysql');
var connection = mysql.createConnection({
host : 'Cloud SQL IP',
user : 'username',
password : 'password',
database : 'db_name'
});
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))
// parse application/json
app.use(bodyParser.json())
// Make globals.js accessible
app.use(express.static(__dirname + '/'));
app.get('/', (req, res) => {
connection.connect();
connection.query('SELECT * FROM Users', function (error, results, fields) {
if (error) throw error;
console.log(results);
});
connection.end();
res.status(200).send('Hello World!');
});
app.get('/login', (req, res) => {
res.status(200).send();
});
// [START server]
const PORT = process.env.PORT || 8080;
app.listen(PORT,() => {
console.log(`App listening on port ${PORT}`);
console.log('Press Ctrl+C to quit.');
});
// [END app]
然而,当我在谷歌应用程序引擎(在端口8080上进行调试和全面部署上https://myapp.appspot.com)执行与此相同的代码,我得到了以下超时错误:
{ Error: connect ETIMEDOUT
at Connection._handleConnectTimeout (/home/megan_cooper2900/project/node_modules/mysql/lib/Connection.js:419:13)
at Socket.g (events.js:292:16)
at emitNone (events.js:86:13)
at Socket.emit (events.js:185:7)
at Socket._onTimeout (net.js:338:8)
at ontimeout (timers.js:386:14)
at tryOnTimeout (timers.js:250:5)
at Timer.listOnTimeout (timers.js:214:5)
--------------------
at Protocol._enqueue (/home/megan_cooper2900/project/node_modules/mysql/lib/protocol/Protocol.js:145:48)
at Protocol.handshake (/home/megan_cooper2900/project/node_modules/mysql/lib/protocol/Protocol.js:52:23)
at Connection.connect (/home/megan_cooper2900/project/node_modules/mysql/lib/Connection.js:130:18)
at app.get (/home/megan_cooper2900/journeyma/app.js:31:13)
at Layer.handle [as handle_request] (/home/megan_cooper2900/project/node_modules/express/lib/router/layer.js:95:5)
at next (/home/megan_cooper2900/project/node_modules/express/lib/router/route.js:137:13)
at Route.dispatch (/home/megan_cooper2900/project/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/home/megan_cooper2900/project/node_modules/express/lib/router/layer.js:95:5)
at /home/megan_cooper2900/project/node_modules/express/lib/router/index.js:281:22
at Function.process_params (/home/megan_cooper2900/project/node_modules/express/lib/router/index.js:335:12)
errorno: 'ETIMEDOUT',
code: 'ETIMEDOUT',
syscall: 'connect',
fatal: true }
这是为什么不工作在Google App Engine应用程序上?
答
在您的mysql连接配置中,host
在App Engine上不起作用。你必须使用socketPath
。 socketPath是unix域套接字连接的路径。当使用的主机和端口被忽略。 (通过在App Engine flex上使用Loopback来传递知识,它使我头撞了几天大声笑)。它的值是您的Cloud SQL实例连接名称
所以,它应该是这样的:/ CLOUDSQL /我的项目-12345:美国central1:MYDATABASE
var connection = mysql.createConnection({ sockePath : '/cloudsql/my-project-12345:us-central1:mydatabase', user : 'username', password : 'password', database : 'db_name' });
这是一个类似过程如果您在GCloud上使用Postgres并已回答here
在主机属性中添加您的实例连接名称 – Fran
主机值通常不是URL形式吗? – Megan
请查看关于从NodeJS连接的许多现有问题。 tl;您需要使用App Engine中的连接支持,而不是通过IP连接。例如https://stackoverflow.com/questions/46749817/cloud-sql-instance-connection-working-locally-but-not-on-app-engine。这个问题是关于postgres的,但解决方案是一样的。 – Vadim