Sequelize.authenticate() 在 Docker 中连接 Google Cloud SQL 时无法正常工作(无成功或错误响应)。

17

我正在使用TypeScript、Express和Sequelize构建API服务器。

这是我的database连接类。

export class Database {
  private _sequelize: Sequelize;
  private config: DBConfigGroup = dbConfig;
  private env = process.env.NODE_ENV as string;

  constructor() {
    this._sequelize = new Sequelize({
      dialect: 'postgres',
      database: this.config[this.env].database,
      username: this.config[this.env].username,
      password: this.config[this.env].password,
      host: this.config[this.env].host,
    });
  }

  async connect(): Promise<void> {
    try {
      console.log('start connect');
      await this._sequelize.authenticate();
      console.log('Connection has been established successfully.'.green.bold);
    } catch (error) {
      console.error('Unable to connect to the database:'.red.bold, error);
    }
  }

  async close(): Promise<void> {
    try {
      await this._sequelize.close();
      console.log('Connection has been close successfully.'.red.bold);
    } catch (error) {
      console.error('Unable to close to the database:'.yellow.bold, error);
    }
  }

  get sequelize(): Sequelize {
    return this._sequelize;
  }
}

所以在我的server.ts文件中,我正在调用这个东西

dotenv.config({
  path: './config/environments/config.env',
});

const database = new Database();
console.log('Init db');
database
  .connect()
  .then(() => {
    console.log('success db ininit');
  })
  .catch((err) => {
    console.log('fail db init: ', err);
  }); 

/**
 * Server Activation
 */
const server = app.listen(PORT, () => {
  console.log(`Server running in ${process.env.NODE_ENV} mode on port ${PORT}`.yellow.bold);
});

我的本地开发环境一切正常。

但是当我尝试使用此配置在 docker compose 中运行时,出现问题。

// docker-compose.yml
version: '3.4'

services:
  api:
    stdin_open: true
    tty: true
    build:
      context: ./api
      dockerfile: Dockerfile.dev
    ports:
      - "5000:5000"
    volumes:
      - /app/node_modules
      - ./api:/app

这是我的Dockerfile.dev文件

FROM node:alpine

ENV NODE_ENV=development

WORKDIR /app

EXPOSE 5000

COPY package.json package-lock.json* ./ 

RUN npm install && npm cache clean --force

COPY . .

CMD ["npm", "run", "dev:docker"]

但问题是当我运行 docker-compose up --build 命令时,我只能看到这些日志

api_1  | Init db
api_1  | start connect
api_1  | Server running in development mode on port 5000

基本上,无论sequelize.authenticate()成功或失败,都没有响应,只会打印出Server running in development mode on port 5000,之后什么也没有了。

为什么在Docker中不像在本地那样工作?有我漏掉的任何配置吗?

谢谢。


可能你无法从那里访问数据库(不同的网络,错误的IP/DNS名称,DB未在该接口上侦听,防火墙规则等),如果你等待一两分钟,你会得到一个超时错误的失败。你没有展示dbConfig - 主机/端口是什么? - CherryDT
@TarunLalwani config只是一个简单的js对象,即使我尝试使用const对象,仍然无法工作。 - Varis Darasirikul
主机是 Google SQL 的 IP 地址。你能分享一下这个 IP 是多少吗?我猜你没有运行 cloud_sql_proxy,对吗? - BYK
@BYK 这是公共 IP 34.69.33.26,我怀疑问题不在于 sequelize 本身,因为如果我使用相同的配置更改到另一个实例上的 mySql,它可以正常工作。 - Varis Darasirikul
也许这能帮到你:https://dev59.com/15nga4cB1Zd3GeqPXl0K#mc7nnYgBc1ULPQZFzgCs - BYK
显示剩余6条评论
2个回答

20

你可以尝试使用node:10版本。

我曾遇到同样的问题,但是当将镜像更改为node:10时,该问题就解决了。

希望能帮到你。


1
很奇怪,但我做了同样的事情,它开始工作了。你知道这背后的原因吗? - Amolpskamble
1
遇到了同样的问题,确实指定另一个版本的node是解决方案。 我的是node:alpine改为node:13.12.0-alpine3.10 - Lykos94
9
天啊,谢谢。我也遇到了同样的问题,以为自己疯了。知道了罪魁祸首后,在 sequelize 的 GitHub 上找到了一个问题。这个冲突是由于过时的 pg 依赖项引起的,它因为 node 中一处未记录的更改而崩溃。如果你将 pg 升级到 8.0.3,就不需要降级 node。这里有更多的解释和参考资料 - Mark
2
我在使用node版本14时,在Mac上遇到了完全相同的问题。降级到12.6.0后问题得到解决。 - Affan Shahab
我曾经苦苦挣扎了7-8天,但解决方案只是将节点版本更改为node:12-12-alpine和pg到8.0.3。解决方案是更改节点或pg的版本即可解决问题。 - MechaCode
显示剩余2条评论

3

最新的Node版本v14.15.5现在在处理这个问题时会抛出一个错误。它指示需要在本地安装pg。

/node_modules/sequelize/lib/dialects/abstract/connection-manager.js:81
    throw new Error(`Please install ${moduleName} package manually`);
          ^

错误: 请手动安装pg包

我这样做了,在我的计算机上解决了这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接