Как подключить Sequelize к базе данных Google Cloud SQL, когда я развернул свой внутренний API Node.JS?

У меня есть серверный API Node.js + Express, и я использую Sequelize ORM для запроса моей базы данных. Моя база данных работает на облачном SQL SQL, и я использую диалект MySQL.

Итак, вот мой index.js, где я инициализирую секвенирование:

import { Sequelize } from "sequelize";


const sequelize = new Sequelize({
    dialect: "mysql",
    database: "databasename",
    username: "databaseusername",
    password: "userpassword",
    port: process.env.PORT || 3306,
    socketPath: "/cloudsql/SQL_CONNECTION_NAME",
    timestamps: false,
});


export default sequelize;

где «SQL_CONNECTION_NAME», очевидно, имеет форму PROJECT_ID:LOCATION:SQL_INSTANCE_NAME.

Я видел так много вариантов определения секвелизации, что просто не знаю, что мне следует помещать в некоторые поля, следует ли их полностью исключить и т. д. (например, в некоторых источниках использовалось поле «хост»). , некоторые нет, некоторые использовали и поле «host», и поле «socketPath» и т. д.)

Вот мой server.js, по сути, точка входа для моего API:

import express from "express"
import router from "./routes.js";
import cors from "cors";
import sequelize from "./sequelize_models/index.js";  // this is the sequelize instance defined above
import { createServer } from "http";
import { Server } from "socket.io";
import path from "path";

const app = express();

app.use(cors());
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

// this endpoint is just for testing
app.get("/", (req, res) =>
{
    res.sendFile(path.join(__dirname, "index.html"));
});

app.use("/api", router);

const server = createServer(app);
export const socketIoServer = new Server(server, {
    cors: {
        origin: "http://localhost:3000",
        methods: ["GET", "POST", "PUT", "DELETE"],
        allowedHeaders: ["Access-Control-Allow-Origin"]
    }
});

sequelize.sync()
         .then(() =>
         {
             console.info("Models synchronized with database.");
         })
         .catch(error =>
         {
             console.error("Error synchronizing models:", error);
         });

socketIoServer.on('connect', socket =>
{
    console.info("A user connected.");

    socket.on('message', data =>
        {
            console.info("Message from user: " + data);
        }
    )
});

server.listen(process.env.PORT || 3306, () =>
{
    console.info(`Server is running on port ${process.env.PORT || 3306}.`);
})

Так что на самом деле, когда я запускаю этот бэкэнд локально (после изменения порта и того, как я немного определяю секвенирование), он работает нормально, и я вижу все элементы из базы данных на моем интерфейсе такими, какими они должны быть. Но когда я запускаю его на своей машине, я также использую это https://cloud.google.com/sql/docs/mysql/connect-auth-proxy, чтобы иметь возможность фактически подключиться к базе данных, я предположим, но, похоже, это не работает, когда развернут мой бэкэнд...

Я развернул этот бэкэнд с помощью инструмента командной строки gcloud с помощью команды gcloud app deploy, и это app.yaml для него:

runtime: nodejs20
service_account: {serviceName}@{PROJECT_ID}.iam.gserviceaccount.com
beta_settings:
  cloud_sql_instances: {PROJECT_ID}:{LOCATION}:{CLOUD_SQL_INSTANCE_NAME}

После развертывания моей серверной части у него есть URL-адрес вида «https://{PROJECT_ID}.ew.r.appspot.com», и на любой конечной точке (которую я определил в своем приложении), я перехожу к ней и просто получаю

{
  "error": "Internal Server Error"
}

с кодом состояния 500.

Я пробовал искать в документах Google другие способы подключения к базе данных, но ни один из них не упомянул что-то вроде сиквелизации, и мне не удалось заставить его работать иначе.

Буду очень признателен за любую помощь!

вы пытаетесь подключиться к экземпляру Cloud SQL с публичным или частным IP-адресом для MySQL?

Jack Wotherspoon 03.07.2024 15:20

@JackWotherspoon Я думаю, что это общедоступный IP-адрес, поскольку в разделе «Подключения» на странице экземпляра Cloud SQL написано, что подключение по частному IP отключено, а подключение по общедоступному IP включено.

Eckchart 06.07.2024 20:56
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, вы неправильно настроили инициализацию клиента Sequelize() в файле index.js.

Согласно документации Sequelize MySQL все пользовательские параметры, такие как socketPath, должны передаваться через dialectOptions. (также если вы подключаетесь через сокет unix, указывать port не следует).

Ваша конструкция Sequelize в index.js должна выглядеть следующим образом:

const sequelize = new Sequelize('database', 'username', 'password', {
  dialect: 'mysql',
  dialectOptions: {
    // Your mysql2 options here
    socketPath: '/cloudsql/SQL_CONNECTION_NAME',
  },
});

Спасибо вам огромное!!!!! ❤❤❤ теперь он отлично работает только с этим единственным изменением, которое вы внесли :) Если кто-то еще наткнется на это и столкнется с похожей проблемой, просто попробуйте точно такую ​​же инициализацию секвенирования, все остальное точно так же, как в моем посте :)

Eckchart 06.07.2024 21:12

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