Error While Running Nestjs in Production Mode, Cannot Find Module
I Have Implemented a Generic Class as Below Which Might Be Causing the Problem, Import { Logger } from '@Nestjs/Common'; Import { Paginationoptionsinterface...
I have implemented a generic class as below which might be causing the problem,
import { Logger } from '@nestjs/common';
import { PaginationOptionsInterface, Pagination } from './paginate';
import { Repository } from 'typeorm';
export class EntityService<T> {
private repository: Repository<T>;
constructor(repository) {
this.repository = repository;
}
async getEntityWithPagination(
options: PaginationOptionsInterface,
): Promise<Pagination<T>> {
const [results, total] = await this.repository.findAndCount({
take: options.limit,
skip: (options.page - 1) * options.limit,
});
return new Pagination<T>({ results, total });
}
}
and using with other entity services, such as
@Injectable()
export class CarService extends EntityService<CarEntity> {
constructor(
@InjectRepository(CarEntity)
private carRepository: Repository<CarEntity>,
) {
super(carRepository);
}
the code is working perfectly fine with npm run start:dev but throwing below error when trying to run with production npm run start:prod
internal/modules/cjs/loader.js:582
throw err;
^
Error: Cannot find module 'src/shared/entity.service'
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:580:15)
at Function.Module._load (internal/modules/cjs/loader.js:506:25)
at Module.require (internal/modules/cjs/loader.js:636:17)
at require (internal/modules/cjs/helpers.js:20:18)
at Object.<anonymous> (/home/tejas/Code/web/project/dist/car/car.service.js:27:26)
at Module._compile (internal/modules/cjs/loader.js:688:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:699:10)
at Module.load (internal/modules/cjs/loader.js:598:32)
at tryModuleLoad (internal/modules/cjs/loader.js:537:12)
at Function.Module._load (internal/modules/cjs/loader.js:529:3)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! [email protected] start:prod: `node dist/main.js`
npm ERR! Exit status 1
I have tried deleting dist folder, but still no luck. I have tried updating packages also, package.json is as follows. I have no clue how to debug this.
dependencies": {
"@nestjs/common": "^5.5.0",
"@nestjs/core": "^5.5.0",
"@nestjs/jwt": "^0.2.1",
"@nestjs/passport": "^5.1.0",
"@nestjs/typeorm": "^5.2.2",
"bcryptjs": "^2.4.3",
"glob": "^7.1.3",
"passport": "^0.4.0",
"passport-http-bearer": "^1.0.1",
"passport-jwt": "^4.0.0",
"pg": "^7.7.1",
"reflect-metadata": "^0.1.12",
"rimraf": "^2.6.2",
"rxjs": "^6.2.2",
"typeorm": "^0.2.9",
"typescript": "^3.2.2"
},
"devDependencies": {
"@nestjs/testing": "^5.5.0",
"@types/express": "^4.16.0",
"@types/jest": "^23.3.1",
"@types/node": "^10.12.18",
"@types/supertest": "^2.0.7",
"jest": "^23.5.0",
"nodemon": "^1.18.9",
"prettier": "^1.14.2",
"supertest": "^3.1.0",
"ts-jest": "^23.1.3",
"ts-loader": "^4.4.2",
"ts-node": "^7.0.1",
"tsconfig-paths": "^3.5.0",
"tslint": "5.11.0",
"webpack": "^4.28.2",
"webpack-cli": "^3.1.2",
"webpack-node-externals": "^1.7.2"
},
12 Answers
I have found the issue, it was because of absolute path while importing the class.
import { EntityService } from '../shared/service-common'; //correct way
import { EntityService } from 'src/shared/service-common'; // wrong autoimport
To fix auto import, I have added this setting in VS Code
"typescript.preferences.importModuleSpecifier": "relative"
Delete the dist directory and run again with:
npm run start:dev
I've also seen the same problem due to a capitalized reference, when the filename is lowercase:
import { SomeClass } from './Some.class';
but the file was named some.class.ts
Fixing the import resolved the error.
I think it's worth mentioning that having js/ts files(that import modules) outside the src folder might cause issues when running start:prod
I had a seed.ts for seeding to my database with Prisma ORM, I moved it inside the src folder and resolved the issue.
Just ensure that your script is pointing to main.js inside dist folder.
"start:prod": "node dist/src/main"
A solution
Remove the noEmit from compilerOptions of tsconfig.json file.
Sometimes the error can be caused by existing code outside the SRC folder (eg Typeform migrations, etc) which causes the compilation inside DIST to enter one level of folders (eg dist/migrations, dist/src) which makes the main file not be in the correct location.
I got this resolved by deleting the generated files and recreating it eg: dist folder
If your problem doesn't include relative directory problem then try to remove the dist folder then try to npm run start:prod again, if you have a tsconfig.build.tsbuildinfo file delete it as well.
I forgot to install these two packages that were required by mikro-orm. Installing solved my issue:
yarn add @mikro-orm/core @mikro-orm/nestjs
In my case the solution was "stupid": you need to give a name for the folder without space. If you write: codes projects, it cannot find, you have to write codes_projects. I am adding this solution since it is too trivial, and likely the last place people will look.
it caused by capitalized file Name.
Key-store.entity.ts -> key-store.entity.ts
make filename all to lowercase.