У меня есть серверный 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 другие способы подключения к базе данных, но ни один из них не упомянул что-то вроде сиквелизации, и мне не удалось заставить его работать иначе.
Буду очень признателен за любую помощь!
@JackWotherspoon Я думаю, что это общедоступный IP-адрес, поскольку в разделе «Подключения» на странице экземпляра Cloud SQL написано, что подключение по частному IP отключено, а подключение по общедоступному IP включено.
Похоже, вы неправильно настроили инициализацию клиента 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',
},
});
Спасибо вам огромное!!!!! ❤❤❤ теперь он отлично работает только с этим единственным изменением, которое вы внесли :) Если кто-то еще наткнется на это и столкнется с похожей проблемой, просто попробуйте точно такую же инициализацию секвенирования, все остальное точно так же, как в моем посте :)
вы пытаетесь подключиться к экземпляру Cloud SQL с публичным или частным IP-адресом для MySQL?