我正在尝试在
Google Cloud Run
上部署 Nodejs 应用程序,该应用程序应该使用 Cloud SQL
ORM 连接到 Sequelize
MySQL 数据库。
如果我对云 sql 实例使用本地代理,效果很好,但是当我尝试将其部署到 Cloud Run 时,Sequelize 无法找到数据库实例。
我尝试在sequelize的主机属性中给出'/cloudsql/',尝试公共IP(每次都会超时)
这就是我的配置:
exports.PRODUCTION = {
HOST: "/cloudsql/<connection-name-here>",
USER: "<db-user",
PASSWORD: "<db-password>",
DB: "<db-name>",
dialect: "mysql",
pool: {
max: 5,
min: 0,
acquire: 30000,
idle: 10000
}
};
我在这里缺少什么?
提前致谢。
我发现了我的错误。我在主机属性中传递 UNIX 套接字路径 (facepalm)
您必须在配置中 dialectOptions 的 socketPath 属性中传递套接字路径。
对于任何想知道如何通过 Sequelize V6 使用 PostgreSQL 来做到这一点的人,下面是我的解决方案:
class Database implements IDatabase {
private static instance: Database;
public sequelize: Sequelize;
/**
* @constructor
*/
private constructor() {
const isProduction: boolean = process.env.NODE_ENV !== "development" && process.env.NODE_ENV !== "test";
this.sequelize = new Sequelize({
host: isProduction ? `/cloudsql/${process.env.SQL_HOST}` : process.env.SQL_HOST_DEV as string,
username: process.env.SQL_USERNAME as string,
password: process.env.SQL_PASSWORD as string,
database: process.env.SQL_DATABASE as string,
dialect: "postgres",
port: isProduction ? Number(process.env.SQL_PORT) : Number(process.env.SQL_PORT_DEV),
logging: isProduction ? console.log : false,
});
}
/**
* Method which returns either the existing instance or instantiates one
* then returns only that preexisting instance
* @return {Database}
*/
public static GetInstance(): Database {
if (!this.instance) {
Database.instance = new Database();
}
return Database.instance;
}
}