Подключение облачной функции (nodejs) к базе данных CloudSQL mySQL

Я пытаюсь подключить облачную функцию 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)

Я был бы признателен за некоторые рекомендации.

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
0
142
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Несколько вещей:

  • Похоже, вы включаете путь к сокету вместо информации о хосте (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, она находится в разделе «Подключиться к этому экземпляру».

Затем перейдите на страницу «Подключения», расположенную в меню слева, затем перейдите на вкладку «Тесты подключения». Нажмите «Создать»

  • Входящий
  • TCP
  • Текущий облачный экземпляр
  • Другой
    • айпи адрес
      • Введите внешний IP-адрес для сети, в которой размещен ваш mySQL Workbench/веб-сервер.
      • Если это сеть, в которой вы сейчас находитесь, просто перейдите на IP Chicken, чтобы получить ее.
  • Снимите флажок «Этот IP-адрес используется в Google Cloud».
  • Убедитесь, что настройки брандмауэра для вашей локальной сети разрешают входящий трафик через порт 80.
  • Создавать

Это проверит вашу способность получать данные из Google Cloud.

Затем вернитесь к «Тестам подключения» и создайте другое подключение, которое проверит вашу способность отправлять данные в Google Cloud (просто измените порядок, но установите флажок, показывающий IP-адрес, используемый в Google Cloud, и выберите свой проект).

Если это не сработает, перейдите на вкладку «Сеть» и обязательно добавьте свой общедоступный IP-адрес в «Авторизованные сети» и повторите попытку.

Если эти тесты не пройдены, что-то не так с вашими настройками подключения.

Вот дополнительная информация о настройках для package.json: Google Cloud — Указание зависимостей для Node.js

Прежде всего, спасибо за ответ. Для хоста я использую внутренний IP-адрес (а не общедоступный IP-адрес). Когда я подключаюсь из mySQL Workbench, я использую общедоступный IP-адрес, но я занес свой адрес из локального в белый список. Я также попробовал общедоступный IP-адрес, но решил, что это не сработает, потому что я не знал IP-адрес функции Google для внесения в белый список. Я что-то упустил здесь?

YKStacker 29.04.2023 15:36

SSL не требуется для базы данных, и в базе данных есть таблица со значением. Авторизация облачных сервисов Google: включена авторизация App Engine: включено шифрование SSL/TLS Только SSL-соединения: не требуется (разрешены незашифрованные соединения)

YKStacker 29.04.2023 15:40

Когда я запускаю вышеуказанное, я получаю: Исключение из готовой функции: Ошибка: подключить ETIMEDOUT. Когда я запускаю функцию, в журнале также отображается «Тип подписи: http» и «URL: localhost: 8080». Я думаю, что есть какой-то IP-адрес, который мне нужно внести в белый список в базе данных для запуска функции с использованием частного IP-адреса. , но мне не ясно, что это будет.

YKStacker 29.04.2023 15:52

Вот полная ошибка, которую я получаю, когда запускаю вышеприведенное: «Ошибка: подключить 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)"

YKStacker 29.04.2023 15:52

Кроме того, просто для устранения проблем, можете ли вы уточнить, что должно быть в package.json? например, какая версия mysql и нужно ли там указывать что-то еще?

YKStacker 29.04.2023 15:55

@YKStacker - базы данных не требуют клиентского SSL-шифрования, но я бы никогда не подключился к базе данных без него, кроме как через зашифрованный VPN или прокси. Учетные данные базы данных (имя пользователя и пароль) передаются по сети в открытом виде.

John Hanley 29.04.2023 23:13

@JohnHanley Отмечено. После настройки я бы сделал это, но на данный момент я просто пытаюсь устранить препятствия, чтобы выяснить, почему я не могу подключиться. Я уверен, что это что-то простое, но я застрял. Эта функция и эта база данных предназначены только для тестирования и будут удалены, когда я найду правильный способ подключения.

YKStacker 30.04.2023 04:38

@YKStacker - Исходное сообщение было отредактировано, чтобы включить дополнительную информацию внизу, потому что ответ был слишком длинным для раздела комментариев. Надеюсь, это поможет.

lostest 30.04.2023 04:53

@YKStacker - я комментировал ваш комментарий выше, чтобы уточнить информацию для будущих читателей. Я не комментировал, чтобы решить проблему в посте.

John Hanley 30.04.2023 06:42

@YKStacker - Ваша проблема здесь: ENOENT /cloudsql/. ENOENT означает, что запись каталога с именем /cloudsql/ не существует. Вы неправильно указываете путь к экземпляру Cloud SQL.

John Hanley 30.04.2023 06:43
Ответ принят как подходящий

Большое спасибо @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/***************' });

Другие вопросы по теме