Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

TypeORM Migration: File must contain a TypeScript / JavaScript code and export a DataSource instance

When trying to autogenerate migrations I get the following error.

File must contain a TypeScript / JavaScript code and export a DataSource instance

This is the command that I am running:

typeorm migration:generate projects/core/migrations/user -d db_config.ts -o

And my db_config.ts file looks like this:

import { DataSource } from "typeorm";

const AppDataSource = new DataSource({
  type: "postgres",
  host: process.env.PGHOST,
  port: 5432,
  username: process.env.PGUSER,
  password: process.env.PGPASSWORD,
  database: process.env.PGDATABASE,
  entities: ["./projects/**/entities/*.ts"],
  migrations: ["./projects/**/migrations/**.js"],
  synchronize: true,
  logging: false,
}); 

export default AppDataSource

My current file structure looks like this:

  • back_end -- projects --- index.ts --- db_config.ts

And my index.ts file looks like this:

import express from "express";
import { AppDataSource } from "./data-source";
import budget_app from "./projects/budget_app/routes";

export const app = express();
const port = 3000;

AppDataSource.initialize()
  .then(() => {
    console.log("Data Source has been initialized!");
  })
  .catch((err) => {
    console.error("Error during Data Source initialization", err);
  });

// export default AppDataSource;

app.get("/", (req, res) => {
  res.send("Hello World!!!!");
});

app.use("/budget_app", budget_app);

app.listen(port, () => {
  console.log(`Example app listening on port ${port}`);
});

I am also running this in a docker container along with my postgres database. I have confirmed that the connection works because if I do synchronize=true it will create the table just fine. I just can't create the migration.

So I'm confused and don't know where to go from here to fix the issue. Thanks for your help in advance!

like image 739
Steve Schierholz Avatar asked Dec 05 '25 19:12

Steve Schierholz


2 Answers

I had trouble with migrations in typeorm, and finally found a solution that will work consistently.

For me, build and then using js datasource didn't work, So I am providing my solution for those who still struggle with typeorm-migrations.

Here is my step by step solution:

  1. Create your datasource config in a file like datasource.config.ts.

    import * as mysqlDriver from 'mysql2';
    import {DataSourceOptions} from 'typeorm';
    import dotenv from 'dotenv';
    
    dotenv.config();
    
    export function getConfig() {
        return {
            driver: mysqlDriver,
            type: 'mysql',
            host: process.env.MYSQL_HOST,
            port: parseInt(process.env.MYSQL_PORT, 10),
            username: process.env.MYSQL_USER,
            password: process.env.MYSQL_PASSWORD,
            database: process.env.MYSQL_DB,
            synchronize: false,
            migrations: [__dirname + '/../../typeorm-migrations/*.{ts,js}'],
            entities: [__dirname + '/../**/entity/*.{ts,js}'],
        } as DataSourceOptions;
    }
    
  2. Create a file with a name like migration.config.ts.

    const datasource = new DataSource(getConfig()); // config is one that is defined in datasource.config.ts file
    datasource.initialize();
    export default datasource;
    
  3. Now you can define your migration commands in the package.json file.

    "migration:up": "ts-node -r tsconfig-paths/register --project ./tsconfig.json ./node_modules/.bin/typeorm migration:run -d config/migration.config.ts",
    "migration:down": "ts-node -r tsconfig-paths/register --project ./tsconfig.json ./node_modules/.bin/typeorm migration:revert -d config/migration.config.ts"
    

With running yarn run migration:up you will be able to run your defined migrations in typeorm-migrations folder.

like image 79
Javad Bayati Avatar answered Dec 08 '25 19:12

Javad Bayati


I was running into the same issues (typeorm 0.3.4). I was just using npx typeorm migration:show -d ./src/data-source.ts and getting the same error as above (File must contain a TypeScript / JavaScript code and export a DataSource instance), while generating the migration file itself worked somehow, but not running/showing the migrations themselves.
My datasource looks like this

export const AppDataSource = new DataSource({
  type: 'postgres',
  url: process.env.DATABASE_URL,
  logging: true,
  entities: ['dist/entities/*.js'],
  migrations: ['dist/migrations/*.js'],
});

because my tsc output lives in /dist. So based on the comments above I started using the datasource file that was generated from TypeScript and the error message changed:

npx typeorm migration:run -d ./dist/appDataSource.js
CannotExecuteNotConnectedError: Cannot execute operation on "default" connection because connection is not yet established.

So I looked into the database logs and realized it wanted to connect to postgres with the standard unix user, it wasn't honoring the connection strings in the datasource code. I had to supply all environment variables to the command as well and it worked: DATABASE_URL=postgresql://postgres:postgres@localhost:5432/tsgraphqlserver npx typeorm migration:run -d ./dist/appDataSource.js

like image 38
ali_huber Avatar answered Dec 08 '25 20:12

ali_huber



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!