Проблема с запросом базы данных mySQL, размещенной в Cloud SQL, с помощью службы Google Run

Для проекта мне пришлось создать онлайн-экземпляр базы данных с использованием MySQL в экземпляре Google Cloud SQL, а затем создать API-интерфейс для подключения к экземпляру базы данных, чтобы запросить его. Следуя руководству Google (ссылка ниже), я создал REST-API как сервис в редакторе Google Cloud Shell, используя node.js. С помощью Cloud Shell я смог создать и развернуть службу, а также создать подключенный к ней облачный экземпляр Run. Если я подключаюсь к базовому получению (см. код ниже), он работает нормально, если я пытаюсь получить информацию из базы данных, я ничего не получаю взамен. Идентификатор сообщения URL-адреса равен 200, запрос считается выполненным или, по крайней мере, он не генерирует ошибку, и после того, как я просто ничего не получаю (если вы видите код ниже, мы должны получить информацию, возвращенную запросом в переменная результатов, но она пуста). Можете ли вы помочь мне понять, чего не хватает?

Вот скрипты, о которых я упоминал выше:

index.js

const express = require("express");
const mysql = require("mysql");
const app = express();

//pool variable
const pool = mysql.createPool({
    user:'username',
    password:'password',
    database:'dbname',
    socketpath:'the instance name given by the instance info page',
});

app.use(express.json());
const port = process.env.PORT || 8080;
app.listen(port, () =>{
    console.info('oraigo rest api listening on port ${port}');
});

// function get to test on port 8080
app.get("/", async (req, res)=>{
    res.json({status:"mario!!"});
});

//app get function to get from db info
app.get("/:user", async (req, res)=>{
    const query = "SELECT * FROM User WHERE id_user=?";
    pool.query(query, [req.params.user], (error, results)=>{
        res.json(results);
        /*if (!results[0]){
            res.json({status:"not fuond"});
        }
        else{
            res.json({status:"ppp"});
        }*/
        //res.json({status:"siamo giusti"});
    });

});

пакет.json

{
    "name": "namename",
    "version": "1.0.0",
    "description": "info desc",
    "main": "index.js",
    "scripts": {
        "start": "node index.js"
    },
    "author": "Gigi",
    "license": "ISC",
    "dependencies": {
        "express": "^4.17.1",
        "mysql": "^2.18.1"
    }
}

Для этого я посмотрел много видео с канала Google Cloud Tech на Youtube, в частности это: https://thewikihow.com/video__w_idf928WY Я следил за всем, за исключением того, что я использую Cloud Shell вместо локального кодирования (но должно быть точно таким же)

Заранее спасибо.

Освоение архитектуры микросервисов с 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
42
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я считаю, что проблема в том, что ваша переменная socketpath неправильно названа и установлена.

Он должен называться socketPath, а не socketpath, со значением, равным '/cloudsql/<PROJECT-ID>:<INSTANCE-REGION>:<INSTANCE-NAME>'

Примечание:<PROJECT-ID>:<INSTANCE-REGION>:<INSTANCE-NAME> также иногда упоминается как INSTANCE_CONNECTION_NAME в примерах и руководствах.

Итак, в контексте создание вашего пула должно выглядеть так:

const pool = mysql.createPool({
  user: <YOUR_DB_USER>,
  password: <YOUR_DB_PASS>,
  database: <YOUR_DB_NAME>,
  socketPath: '/cloudsql/<PROJECT-ID>:<INSTANCE-REGION>:<INSTANCE-NAME>',
});

Таким образом, если ваш экземпляр Cloud SQL был назван mysql-экземпляр в регионе us-central1 в рамках проекта с именем и идентификатором мой крутой проект, тогда параметр пути вашего сокета будет следующим: socketPath: '/cloudsql/my-cool-project:us-central1:mysql-instance'

P.S. Вот исходный код учебника для ссылки на видео, которой вы поделились, если вы хотите сослаться на нее напрямую.

Спасибо за ответы. Но имя экземпляра правильное. Мне удалось заставить его работать, принудительно подключившись к базе данных sql в настройках подключения во время создания службы

Giovanni Minchio 10.05.2022 14:05

Вы не против уточнить свое решение? Мне любопытно, что вы подразумеваете под «форсированием соединения».

Jack Wotherspoon 10.05.2022 15:09

Я думаю, что я плохо объяснил себя в предыдущем сообщении. Я имею в виду, что автоматически при создании образа контейнера также устанавливается вся информация для подключения к базе данных. Я думал, что все остальное на автомате. Вместо этого во время создания службы в настройках соединения соединение Cloud SQL должно быть установлено на базу данных, которую вы собираетесь использовать. Я видел видео, где этот последний шаг был опущен, и все работало одинаково, но не в моем случае.

Giovanni Minchio 11.05.2022 16:20
Ответ принят как подходящий

Мне удалось заставить его работать, принудительно подключившись к базе данных SQL в настройках подключения во время создания службы.

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