Search code examples
javascriptnode.jstypescripttypeorm

NodeJS problems with imports when transpiling from typescript


I have implemented simple rest api with nodejs and connection to database via typeorm. Here are some snippets of code which I wrote:

import {
  Entity,
  PrimaryGeneratedColumn,
  Column,
  Unique,
  CreateDateColumn,
  UpdateDateColumn
} from "typeorm";
import { Length, IsNotEmpty } from "class-validator";
import bcrypt from "bcryptjs";

@Entity()
@Unique(["username"])
export class User {
  @PrimaryGeneratedColumn()
  public id: number;

  @Column()
  @Length(4, 20)
  username: string;
}

tsconfig.json

{
    "compilerOptions": {
        "experimentalDecorators": true,
        "module": "commonjs",
        "esModuleInterop": true,
        "target": "es6",
        "moduleResolution": "node",
        "sourceMap": true,
        "outDir": "dist",
        "emitDecoratorMetadata": true
    },
    "lib": [
        "es2015"
    ]
}

package.json

{
    "name": "node-with-ts",
    "version": "1.0.0",
    "description": "",
    "main": "dist/app.js",
    "scripts": {
        "start": "tsc && node dist/app.js",
        "test": "echo \"Error: no test specified\" && exit 1",
        "tsc": "tsc",
        "prod": "node ./dist/app.js",
        "build": "npm install && tsc -p .",
        "reset": "rm -rf node_modules/ && rm -rf dist/ && npm run build",
        "migration:run": "ts-node ./node_modules/typeorm/cli.js migration:run"
    },
    "author": "",
    "license": "ISC",
    "devDependencies": {
        "@types/express": "^4.16.1",
        "@types/node": "^12.7.5",
        "nodemon": "^1.19.2",
        "ts-node": "8.4.1",
        "tslint": "^5.12.1",
        "typescript": "^3.3.3"
    },
    "dependencies": {
        "@types/bcryptjs": "^2.4.2",
        "@types/body-parser": "^1.17.0",
        "@types/cors": "^2.8.4",
        "@types/helmet": "0.0.42",
        "@types/jsonwebtoken": "^8.3.0",
        "bcryptjs": "^2.4.3",
        "body-parser": "^1.18.1",
        "class-validator": "^0.9.1",
        "cors": "^2.8.5",
        "express": "4.17.1",
        "helmet": "^3.21.1",
        "jsonwebtoken": "^8.4.0",
        "reflect-metadata": "^0.1.13",
        "sqlite3": "^4.1.0",
        "ts-node-dev": "^1.0.0-pre.32",
        "typeorm": "^0.2.12"
    }
}

I have pasted lots of code because I have no idea what is wrong. I am tryinf to run app via npm run start and it throws below error:

> tsc && node dist/app.js

    /Users/workspace/node_typescript_project/src/entity/User.ts:1
    (function (exports, require, module, __filename, __dirname) { import {
                                                                  ^^^^^^

    SyntaxError: Unexpected token import

Although I able to build to project and it generates js codes but when it comes to run application it throws errors.


Solution

  • Your entities are probably not being referenced correctly in your Typeorm config file.

    Try to see if you can get it to work with the following ormconfig.js file (pay special attention to the entities property:

    // ormconfig.js at root of project
    const isDevelopment = process.env.NODE_ENV === 'development';
    module.exports = {
      type: 'mysql',
      host: process.env.MYSQL_HOST,
      port: process.env.MYSQL_TCP_PORT,
      username: process.env.MYSQL_USER,
      password: process.env.MYSQL_PASSWORD,
      database: process.env.MYSQL_DATABASE,
      synchronize: isDevelopment,
      logging: isDevelopment,
      entities: [
        isDevelopment ? `src/**/*.entity.ts` : `dist/**/*.entity.js`,
      ],
      migrations: [`src/migration/**/*.ts`],
      subscribers: ['src/subscriber/**/*.ts'],
      cli: {
        entitiesDir: 'src/entity',
        migrationsDir: 'src/migration',
        subscribersDir: 'src/subscriber',
      },
    };
    

    With this setup, I have ts-node working directly with my Typescript source files, and only in production do I use tsc to build. When building for prod, I need to reference the .js files inside of the dist folder.