typeorm: Column type for UserModel#userId is not defined and cannot be guessed. Make sure you have turned on an "emitDecoratorMetadata": true option in tsconfig.json.

Column type for UserModel#userId is not defined and cannot be guessed. Make sure you have turned on an “emitDecoratorMetadata”: true option in tsconfig.json. Also make sure you have imported “reflect-metadata” on top of the main entry file in your application (before any entity imported).If you are using JavaScript instead of TypeScript you must explicitly provide a column type. ExceptionsManager.js:76 Module AppRegistry is not a registered callable module (calling runApplication)

package.json

{ "name": "janmanch", "version": "0.0.1", "private": true, "scripts": { "start": "node node_modules/react-native/local-cli/cli.js start", "test": "jest" }, "dependencies": { "@babel/runtime": "^7.1.2", "@ldn0x7dc/react-native-view-pager": "0.0.9", "npm": "^6.1.0", "react": "16.3.1", "react-native": "0.57.0", "react-native-bottomsheet": "^1.9.0", "react-native-datepicker": "^1.7.2", "react-native-device-info": "^0.21.5", "react-native-elements": "^0.19.1", "react-native-flexi-radio-button": "^0.2.2", "react-native-localization": "^1.0.10", "react-native-permissions": "^1.1.1", "react-native-splash-screen": "^3.0.9", "react-native-sqlite-storage": "^3.3.6", "react-native-swiper": "^1.5.13", "react-native-vector-icons": "^4.6.0", "react-navigation": "^2.3.1", "realm": "^2.8.4", "reflect-metadata": "^0.1.12", "remove": "^0.1.5", "typeorm": "^0.2.7" }, "devDependencies": { "@babel/plugin-external-helpers": "^7.0.0", "@babel/plugin-proposal-decorators": "^7.1.2", "@types/jest": "23.1.0", "@types/react": "16.3.18", "@types/react-native": "0.55.20", "@types/react-native-datepicker": "^1.6.3", "@types/react-navigation": "^2.0.5", "@types/react-test-renderer": "16.0.1", "babel-jest": "23.0.1", "babel-plugin-transform-async-to-generator": "^6.24.1", "babel-preset-react-native": "4.0.0", "jest": "23.1.0", "metro-react-native-babel-preset": "^0.47.0", "react-native-typescript-transformer": "1.2.10", "react-test-renderer": "16.3.1", "schedule": "0.4.0", "ts-jest": "22.4.6", "typescript": "2.9.2" }, "jest": { "preset": "react-native", "transform": { "^.+\\.(js)$": "<rootDir>/node_modules/babel-jest", "\\.(ts|tsx)$": "<rootDir>/node_modules/ts-jest/preprocessor.js" }, "testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$", "moduleFileExtensions": [ "ts", "tsx", "js", "jsx", "json", "node" ], "modulePaths": [ "<rootDir>" ] } }

tsconfig

{ "compilerOptions": { "allowSyntheticDefaultImports": true, "allowJs": true, "esModuleInterop": true, "jsx": "react", "module": "es6", "moduleResolution": "node", "noEmit": true, "noImplicitAny": true, "target": "es6", /*Below code custom added*/ "baseUrl": "./src", // "skipLibCheck": true, "sourceMap": true, "emitDecoratorMetadata": true, "experimentalDecorators": true, // "outDir": "./build" }, "include": ["./src"], "exclude": ["node_modules"] }

About this issue

  • Original URL
  • State: closed
  • Created 6 years ago
  • Reactions: 1
  • Comments: 40 (2 by maintainers)

Most upvoted comments

@Column() must set a type,like @Column('text',{nullable:true})

In your tsconfig.json, you can explicitly specify "strict": false, to disable strict type-checking.

Set the following in tsconfig.json

"emitDecoratorMetadata": true,

and

"strict": false,

Hello, i’ve built a plugin to compile runtime metadata information from TypeScript even if using @babel/preset-typescript instead of TSC. Not sure if this is your problem, but in case you can try: https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata#readme

Elseway as @shouhuori suggested you can just type the colum type

Hi. I just ran into this issue and fixed it. When I had the issue, my entity looked like this:

import { Entity, PrimaryColumn, Column } from "typeorm/browser";

@Entity("tenant")
export class Tenant {

  @PrimaryColumn()
  id!: number;

  @Column()
  unitNumber!: number;

  @Column()
  blockNumber!: number;

  @Column()
  fullName!: string;
}

And like @shouhuori mentioned, a type must be added to the column. And that fixed it:

@Entity("tenant")
export class Tenant {

  @PrimaryColumn("int")
  id!: number;

  @Column("int")
  unitNumber!: number;

  @Column("int")
  blockNumber!: number;

  @Column("text")
  fullName!: string;
}

From my understanding the type is required in the annotation for the database, while the other type below it is for typescript inference.

Thanks @leonardfactory for that package, it solved the problem for me!

to add to that - I found that it only worked when using the legacy decorator plugin for babel:

    plugins: [
      'babel-plugin-transform-typescript-metadata',
      ["@babel/plugin-proposal-decorators", { "legacy": true }],
      ["@babel/plugin-proposal-class-properties", { "loose" : true }]
    ],

Adding a attributes in tsconfig.ts solved my problem: “emitDecoratorMetadata”: true You can refer details from api https://www.typescriptlang.org/docs/handbook/compiler-options.html

In my case I accidentally had an extra @Column decorator

@Column() <--- 
@ManyToOne(
  () => User,
  user => user.videos,
)
@JoinColumn({ name: 'uploaded_by_id' })
uploaded_by: User

tbh none of the above solutions worked for me. What worked was clearing all the generated files under /dist and rebuilding the project.

I’m sure a noob like me will reach here sometime and it will help them 😄

My issue was with PrimaryColumn

I fixed it like:

@Entity("tenant")
export class Tenant {
  @PrimaryColumn("int")
  id!: number;
  ...
}

@leonardfactory, that fixed the error I was having using typeorm with nextjs (which is using babel). Thanks!

Adding types everywhere eventually helped in my case, like @Column('varchar'), @Column('integer')

I have this issue tsconfig.json

...
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,   
...

app.ts

import "reflect-metadata";

import { DataSource } from "typeorm";
import { Entity, Column, PrimaryGeneratedColumn } from "typeorm";

@Entity()
export class Photo {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @Column()
  description: string;

  @Column()
  filename: string;

  @Column()
  views: number;

  @Column()
  isPublished: boolean;
}

const AppDataSource = new DataSource({
  type: "postgres",
  host: "localhost",
  port: 5432,
  username: "root",
  password: "admin",
  database: "test",
  entities: [Photo],
  synchronize: true,
  logging: true,
});

AppDataSource.initialize()
  .then(() => {
  })
  .catch((error) => console.log(error));

It makes absolutely no sense. I have tried doing everything in this issue to no avail. I don’t want to specify types manually.

ColumnTypeUndefinedError: Column type for Photo#name is not defined and cannot be guessed. Make sure you have turned on an “emitDecoratorMetadata”: true option in tsconfig.json. Also make sure you have imported “reflect-metadata” on top of the main entry file in your application (before any entity imported).If you are using JavaScript instead of TypeScript you must explicitly provide a column type.

I don’t know whether it can help you but for me it was I just complied my NodeJS project typescript files like this: tsc src/**/* which resulted in this error. When I‌ just removed my .js files in the src folder, everything worked just fine.

I‌ should mention that tracking the error helped me a lot. To do that find node_modules/typeorm/error/ColumnTypeUndefinedError.js file and in ColumnTypeUndefinedError function before return _this; add console.log(_this); or whatever log you use. This will show the entire error including stack, instead of only message.

Hope it could help you.

@Column() must set a type,like @Column('text',{nullable:true})

fixed in the TypeOrm 0.3.12 with Serverless 3.27. Thank You

In my case it was just a stupid copy paste error, might be your case too:

@Column()  // this should not be here as we only use OneToMany instead of Column()
@OneToMany(() => Review, (review) => review.book)

I was using both of them together

I hope that helps

with this code run for me

tsc .\src\index.ts --experimentalDecorators "true" --emitDecoratorMetadata "true"

I solved my problem at class definition, I forgot to set user_id field on File.ts:

@ManyToOne(() => User, (user) => user.files)
@JoinColumn({ name: 'user_id' })
user: User;

Do you mind posting a sample project gist, or a trivial example? Nothing from what you posted looks wrong to my eyes, but it may be that you are missing something in your source code. For example import "reflect-metadata"; in the entry point before importing entities, etc.

Thanks @leonardfactory for that package, it solved the problem for me!

to add to that - I found that it only worked when using the legacy decorator plugin for babel:

    plugins: [
      'babel-plugin-transform-typescript-metadata',
      ["@babel/plugin-proposal-decorators", { "legacy": true }],
      ["@babel/plugin-proposal-class-properties", { "loose" : true }]
    ],

Its working, thanks dude ❤️