Я пытаюсь подключить облачную функцию Google (Gen 2, nodejs 18) к базе данных CloudSQL mySQL. Они оба находятся в одном проекте и в одном регионе в Google Cloud.
Откровенно говоря, я уже часами пытаюсь подключиться к бесчисленным веб-страницам.
Я следил: https://cloud.google.com/sql/docs/mysql/connect-functions#node.js Но это дает мне только часть связи. Я не понимаю, как лучше всего использовать созданный им пул. Он связывает меня с кодом в GitHub, но этот код гораздо функциональнее и сложнее, чем я готов сделать. Я просто хочу читать из простой таблицы.
Я перепроверил все свои соединения. Я могу подключиться к таблице через mySQL Workbench, используя пользователя и пароль. Я предоставил Cloud SQL Client разрешения для сервисного аккаунта. Я просто не могу поверить, что так сложно связать продукт Google с продуктом Google в одном проекте.
Может ли кто-нибудь просто дать мне правильный код, который я могу вырезать, вставить и добавить свои учетные данные для чтения таблицы из моей базы данных? Я ищу все, начиная с "const mysql = require('promise-mysql');" для возврата значений из базы данных в журнале консоли. Я могу разобраться с остальными, если только смогу понять эту связь.
В базе данных включено как общедоступное, так и частное IP-соединение.
Если есть что-то еще, что мне нужно настроить, пожалуйста, дайте мне знать.
Моя последняя версия:
var mysql = require('mysql');
var con = mysql.createConnection({
user: '***********',
password: '***************',
database: '***********',
socketPath: '/cloudsql/******************'
});
con.connect(function(err) {
if (err) throw err;
con.query("SELECT * FROM **********", function (err, result, fields) {
if (err) throw err;
console.info(result);
});
});
Но от этого я получаю ошибку: подключить ENOENT /cloudsql/<> в PipeConnectWrap.afterConnect [как oncomplete] (узел: сеть: 1494:16)
Я был бы признателен за некоторые рекомендации.






Несколько вещей:
Похоже, вы включаете путь к сокету вместо информации о хосте (IP-адрес сервера). Остальная часть вашего кода выглядит хорошо.
В целях устранения неполадок я бы удалил запрос и добавил его обратно после того, как вы убедитесь, что у вас хорошее соединение.
Попробуй это:
var mysql = require('mysql');
var con = mysql.createConnection({
host: "localhost",
user: "yourusername",
password: "yourpassword"
});
con.connect(function(err) {
if (err) throw err;
console.info("Connected!");
});Если у вас по-прежнему возникают проблемы с подключением, убедитесь, что вы также добавили IP-адрес своей домашней/офисной/веб-серверной сети, чтобы разрешить подключение к Google Cloud. Попробуйте как входящий, так и исходящий тест через меню подключения Google Cloud mySQL (IP-адрес сервера к вашему IP-адресу и наоборот).
Если у вас включен SSL, вам нужно будет сгенерировать сертификат и включить дополнительный код для вашего подключения.
Убедитесь, что вы настроили таблицы на своем сервере MySQL и вставили в них некоторые данные, иначе запрос ничего не вернет.
2023.04.29 Ответ @YKStacker (слишком длинный для комментариев):
Локальный хост должен быть IP-адресом базы данных Google Cloud mySQL, к которой вы пытаетесь подключиться. Если вы перейдете на страницу обзора Google Cloud SQL, она находится в разделе «Подключиться к этому экземпляру».
Затем перейдите на страницу «Подключения», расположенную в меню слева, затем перейдите на вкладку «Тесты подключения». Нажмите «Создать»
Это проверит вашу способность получать данные из Google Cloud.
Затем вернитесь к «Тестам подключения» и создайте другое подключение, которое проверит вашу способность отправлять данные в Google Cloud (просто измените порядок, но установите флажок, показывающий IP-адрес, используемый в Google Cloud, и выберите свой проект).
Если это не сработает, перейдите на вкладку «Сеть» и обязательно добавьте свой общедоступный IP-адрес в «Авторизованные сети» и повторите попытку.
Если эти тесты не пройдены, что-то не так с вашими настройками подключения.
Вот дополнительная информация о настройках для package.json: Google Cloud — Указание зависимостей для Node.js
SSL не требуется для базы данных, и в базе данных есть таблица со значением. Авторизация облачных сервисов Google: включена авторизация App Engine: включено шифрование SSL/TLS Только SSL-соединения: не требуется (разрешены незашифрованные соединения)
Когда я запускаю вышеуказанное, я получаю: Исключение из готовой функции: Ошибка: подключить ETIMEDOUT. Когда я запускаю функцию, в журнале также отображается «Тип подписи: http» и «URL: localhost: 8080». Я думаю, что есть какой-то IP-адрес, который мне нужно внести в белый список в базе данных для запуска функции с использованием частного IP-адреса. , но мне не ясно, что это будет.
Вот полная ошибка, которую я получаю, когда запускаю вышеприведенное: «Ошибка: подключить ETIMEDOUT к Connection._handleConnectTimeout (/workspace/node_modules/mysql/lib/Connection.js:409:13) к Object.onceWrapper (узел: события: 627: 28) в Socket.emit (узел:события:513:28) в Socket.emit (узел:домен:489:12) в Socket._onTimeout (узел:сеть:570:8) в listOnTimeout (узел:внутренние/таймеры: 569:17) в процессе.processTimers (узел:внутренние/таймеры:512:7)"
Кроме того, просто для устранения проблем, можете ли вы уточнить, что должно быть в package.json? например, какая версия mysql и нужно ли там указывать что-то еще?
@YKStacker - базы данных не требуют клиентского SSL-шифрования, но я бы никогда не подключился к базе данных без него, кроме как через зашифрованный VPN или прокси. Учетные данные базы данных (имя пользователя и пароль) передаются по сети в открытом виде.
@JohnHanley Отмечено. После настройки я бы сделал это, но на данный момент я просто пытаюсь устранить препятствия, чтобы выяснить, почему я не могу подключиться. Я уверен, что это что-то простое, но я застрял. Эта функция и эта база данных предназначены только для тестирования и будут удалены, когда я найду правильный способ подключения.
@YKStacker - Исходное сообщение было отредактировано, чтобы включить дополнительную информацию внизу, потому что ответ был слишком длинным для раздела комментариев. Надеюсь, это поможет.
@YKStacker - я комментировал ваш комментарий выше, чтобы уточнить информацию для будущих читателей. Я не комментировал, чтобы решить проблему в посте.
@YKStacker - Ваша проблема здесь: ENOENT /cloudsql/. ENOENT означает, что запись каталога с именем /cloudsql/ не существует. Вы неправильно указываете путь к экземпляру Cloud SQL.
Большое спасибо @lostest за предыдущий ответ, который помог мне приблизиться к ответу. В частности, тесты подключения очень помогли мне.
Ответ заключается в правильной настройке соответствующего Cloud Run. В частности, мне нужно было перейти к экземпляру Cloud Run, связанному с моей облачной функцией*. Нажмите «Изменить и развернуть новую версию», а затем прокрутите вниз до «Подключения к Cloud SQL» и выберите имя моего экземпляра Cloud SQL.
Чтобы заставить тест подключения работать, мне нужно было убедиться, что выбран общедоступный IP-адрес и порт 3306.
Также следует отметить, что я подключаюсь через Cloud SQL Auth Proxy (все еще немного нечетко для меня), а не через VPC. Это означает, что я подключаюсь через общедоступный IP-адрес, а не через внутренний частный IP-адрес.
* Как оказалось, я упустил важный факт выше. Я использовал облачную функцию Gen 2, которая использует Cloud Run.
Кроме того, для записи моя строка подключения просто:
var con = mysql.createConnection({ user: '*********', password: '***********', socketPath: '/cloudsql/***************' });
Прежде всего, спасибо за ответ. Для хоста я использую внутренний IP-адрес (а не общедоступный IP-адрес). Когда я подключаюсь из mySQL Workbench, я использую общедоступный IP-адрес, но я занес свой адрес из локального в белый список. Я также попробовал общедоступный IP-адрес, но решил, что это не сработает, потому что я не знал IP-адрес функции Google для внесения в белый список. Я что-то упустил здесь?