带打字稿和泊坞窗的Typrom Postgres连接

时间:2019-08-29 17:31:58

标签: node.js typescript docker webpack typeorm

我正在尝试在节点项目中使用typeorm。因此,数据库是通过泊坞窗旋转的。现在,当容器停止并重新启动时,ip会不断变化,因此更好的可能性是在我的配置中使用容器名称。

现在真正的混乱开始了,所以我尝试使用env变量配置连接选项,似乎它无法解析主机(当作为Docker容器提供时)。

这是我的示例.env文件

TYPEORM_HOST=postgres-container
TYPEORM_POSTGRES_USERNAME=postgres
TYPEORM_POSTGRES_PASSWORD=XXXXXX
TYPEORM_TYPE=postgres
TYPEORM_LOGGING=true
TYPEORM_SYNCHRONIZE=true
TYPEORM_DATABASE=XXXXX
PINO_ENABLE_LOGGING= true

当我尝试在我的应用程序中使用它时,这引发了一个错误,指出找不到主机,因此将其还原回ip并且可以正常工作

   const databaseConfigParams = DatabaseConfigInstance.getConnectionParams();
    ......
   try {
            const connec = await createConnection({
                name: DB_CONNECTION_NAME,
                type: DatabaseConnectionEnum.POSTGRES,
                host: databaseConfigParams.getHost(),
                port: parseInt(databaseConfigParams.getPort()),
                username: databaseConfigParams.getUsername(),
                password: databaseConfigParams.getPassword(),
                database: databaseConfigParams.getDatabase(),
                logging: databaseConfigParams.isLogging(),
                synchronize: databaseConfigParams.isSynchronize(),
                entities: [XXXEntity, XXEntity, XXXEntity]

             });
             res(connec);
        } catch (err){
            console.log('error in creating connection:', err);
            rej(err);
        }

现在,如果将配置作为环境var提供,则无法解析容器名称,因此我决定将配置移至ormconfig.js文件。

现在我可以在哪里指定要使用的实体? 。由于我使用webpack捆绑应用程序,因此即使捆绑了应用程序,我也需要识别实体。

这是我的webpack配置

const path = require('path');
const webpack = require('webpack');
const nodeExternals = require('webpack-node-externals');
const dotEnvPlugin = require('dotenv-webpack');
const TerserPlugin = require('terser-webpack-plugin');
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');

'use strict';

module.exports = {
  entry: './src/app/server.ts',
  mode: 'development',
  optimization: {
    minimizer: [
    new UglifyJsPlugin({
        uglifyOptions: {
          keep_classnames: true,
          keep_fnames: true
        }
      })
    ],
  },
  output: {
    path: path.join(__dirname, 'dist'),
    filename: '[name].js'
  },
  resolve: {
    extensions: ['.ts', '.js'],
  },
  module: {
    rules: [
      {
        test: /\.ts$/,
        use: [
          'ts-loader',
        ]
      },
      {
        test: /\.handlebars$/,
        loader: 'handlebars-loader',
        options: {
            knownHelpersOnly: false,
            inlineRequires: /\/assets\/(:?images|audio|video)\//ig,
            partialDirs: [path.join(__dirname, './src/views/email/partials')],
        },
    }
    ]

  },
  externals: [ nodeExternals() ],
  plugins: [
    new dotEnvPlugin({
        path: './config/development/.env',
        safe: true, 
        systemvars: true, 
        silent: true,
        defaults: false
    }),
    new webpack.DefinePlugin({
        'process.env.NODE_ENV': 'development',
        'process.env.DEBUG': 'false'
    }),

    // need this plugin for the maps to be generated
    new webpack.EvalSourceMapDevToolPlugin({
      filename: '[name].map.js'
    }),
    new webpack.WatchIgnorePlugin([
      path.join(__dirname, "node_modules")
    ]),

  ]

};

编辑:

我尝试在oemconfig.js中使用指定实体。它适用于ts节点编译,但不适用于webpack。

module.exports = {
  name: 'postgresConnection',
  type: 'postgres',
  host: '172.17.0.3',
  port: 5432,
  username: 'postgres',
  password: 'XXX',
  database: 'XXX',
  synchronize: true,
  logging: true,
  "entities": [
      "src/app/modules/database/entities/*.ts"
  ],
};

所以我有两个问题。不知道应该采用哪种方法。我需要链接postgres-container(docker)并在我的typeorm中使用它。另外,我需要制作捆绑的代码(在webpack捆绑之后)才能使用正确的实体文件夹。

1 个答案:

答案 0 :(得分:0)

我没有尝试将postgres容器链接到我的终端,这是导致问题的原因。抱歉,我没有尝试在结尾处链接容器。我的错。现在,它可以完美运行。我可以回复到在env文件中声明typeorm连接选项,并在ts文件本身中声明适合于webpack配置的实体

也许如果有人也遇到类似的问题,这会帮助他们 我的.env文件

TYPEORM_HOST=postgres-container
TYPEORM_POSTGRES_USERNAME=postgres
TYPEORM_POSTGRES_PASSWORD=XXXXXX
TYPEORM_TYPE=postgres
TYPEORM_LOGGING=true
TYPEORM_SYNCHRONIZE=true
TYPEORM_DATABASE=XXXXX

我的Dockerfile(FROM映像是我自己的节点映像。显然dockerhub中的映像12.9.0存在并发性问题,并且较旧的版本似乎不支持atob模块base64解析,因此从UBUNTU创建了我自己的映像并推送到私有dockerhub)

FROM vijayakumarpsg587/node-12:1.01
# install pm2 and link the image using environment variables
RUN npm install pm2 -g

# Create a seperate node user
RUN useradd -ms /bin/bash node-user

RUN mkdir -p /home/node/app  
# RUN chown -R node-user:node-user /home/node/app && chmod -R u+rwx,go+rwx /home/node/app
WORKDIR /home/node/app
# USER node-user
COPY package*.json ./
RUN npm install

COPY . ./ 


RUN npm run build:webpack:dev
ENV PM2_PUBLIC_KEY XXX
ENV PM2_SECRET_KEY XXX

博览会3002

CMD [“ pm2-runtime”,“ ./dist/main.js”]

其相同的webpack配置。此外,用于从.env检索内容的ts文件也相同。

真正的问题是我没有将 postgres-容器链接到我构建的新应用容器。

所以首先我创建一个新的应用程序图像并旋转一个容器

  

docker build -t XXXX / XXX:。

  • (。)指示从当前Dockerfile位置构建映像。用给定标签构建图像

从图像中旋转一个容器,同时链接postgres-container

docker run -d -p 3002:3002 --name <name of the container> --link postgres-container <image that you created earlier with the prev command>

编辑:编写dockerfile时,请遵循dockerfile准则中的最佳做法。说明RUN,COPY ADD会创建新的图像层,并且它们应尽可能小。如果需要,请尝试创建多阶段构建。