【问题标题】:Sequelize can't connect to postgres on dockerSequelize 无法连接到 docker 上的 postgres
【发布时间】:2020-08-26 11:07:39
【问题描述】:

当我尝试运行我的服务器时,sequelize 未连接到数据库,因此没有创建我的模型。

我的 docker-compose

version: "3.7"
services:
   backend:
    build: ./Trademon-Backend
    environment:
      DB_USER: postgres
      DB_PASSWORD: postgres
      DB_NAME: Trademon
      DB_HOST: database
      DB_PORT: 5432
      DB_DIALECT: postgres
      DB_RECREATE: 1 # To recreate database
      JWT_SECRET: TrademonSecret
    ports:
      - "8000:8000"
    volumes:
      - ./Trademon-Backend:/backend/
      - /backend/node_modules/
    depends_on:
      - database
    command: ["./wait-for-it.sh", "database:5432", "--", "nodemon"]

  database:
    image: postgres:latest
    restart: always
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: Trademon
    volumes:
      - ~/databases/Trademon:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 30s
      timeout: 30s
      retries: 3

我的 app.js

const express = require("express");
const path = require("path");
const cookieParser = require("cookie-parser");
const logger = require("morgan");
const passport = require("passport");

const db = require("./models/index").sequelize;

const usersRouter = require("./routes/v1/users");

const app = express();

const RECREATE_DB = !!+process.env.DB_RECREATE || false;

require("./config/passport");

/**
 * Passport initialization
 */
app.use(passport.initialize());

/**
 * Database connection
 */

console.log("Trying to connect to database...");

try {
  db.authenticate();
  console.log("Connection to database has been established successfully.");

  if (RECREATE_DB) {
    console.log("Recreating database!");
    db.sync({ force: true });
  }
} catch (err) {
  console.error("Unable to connect to the database:", err);
}

app.use(logger("dev"));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, "public")));

app.use("/v1/users", usersRouter);

app.use((req, res) => {
  res.status(404).send("Sorry this page does not exist!");
});

module.exports = app;

我的续集配置

"use strict";

const fs = require("fs");
const path = require("path");
const Sequelize = require("sequelize");

const env = process.env.NODE_ENV || "development";
const config = require(__dirname + "/../config/database.js")[env];
const basename = path.basename(__filename);
const db = {};

let sequelize;
if (config.use_env_variable) {
  sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
  sequelize = new Sequelize(
    config.database,
    config.username,
    config.password,
    config
  );
}

fs.readdirSync(__dirname)
  .filter(file => {
    return (
      file.indexOf(".") !== 0 && file !== basename && file.slice(-3) === ".js"
    );
  })
  .forEach(file => {
    const model = sequelize["import"](path.join(__dirname, file));
    db[model.name] = model;
  });

Object.keys(db).forEach(modelName => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

My log on console

我没有从 db.authenticate() 收到错误,但什么也没发生,执行继续到下一行 (console.logs)。

有什么帮助吗?


编辑: 这是与节点 v14 的不兼容,因此降级到 v13 或 LTS 解决了我的问题。

【问题讨论】:

  • 请发布Trademon-Backend Dockerfile和你的package.json
  • 谢谢,但在 sequelize github 上搜索问题后,我发现问题出在节点版本上,我在 dockerfile 上有 node:current,当我将其更改为 lts 或 13 时,它运行没有问题. Github issue
  • 升级到 pg@8.0.3 应该可以解决问题,too

标签: node.js postgresql docker docker-compose sequelize.js


【解决方案1】:

停止您的应用程序:

docker-compose down

清理你的数据库文件:

rm -rf ~/databases/Trademon/*

然后重新开始:

docker-compose up

然后恢复数据库备份(如果有)。

【讨论】:

  • 谢谢,但在 sequelize github 上搜索问题后,我发现问题出在节点版本上,我在 dockerfile 上有 node:current,当我将其更改为 lts 或 13 时,它运行没有问题. Github issue
猜你喜欢
  • 2020-11-27
  • 1970-01-01
  • 2018-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多