在生产模式下运行NestJS时出现错误,找不到模块。

59

我已经实现了一个通用的类,如下所示,这可能会导致问题:

    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 });
      }
    }

并与其他实体服务一起使用,例如

    @Injectable()
    export class CarService extends EntityService<CarEntity> {
      constructor(
        @InjectRepository(CarEntity)
        private carRepository: Repository<CarEntity>,
      ) {
        super(carRepository);
      }

当使用 npm run start:dev 运行代码时,一切正常,但是当尝试使用生产模式下的 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! project@0.0.0 start:prod: `node dist/main.js`
        npm ERR! Exit status 1

我已经尝试删除 dist 文件夹,但还是没有成功。我也尝试更新包,package.json 如下所示。我不知道如何调试这个问题。

        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个回答

109

我找到了问题所在,是因为在导入类时使用了绝对路径。

import { EntityService } from '../shared/service-common'; //correct way

import { EntityService } from 'src/shared/service-common'; // wrong autoimport

为了修复自动导入的问题,我已经在VS Code中添加了此设置

"typescript.preferences.importModuleSpecifier": "relative"

1
你好,我想知道为什么在tsconfig.json中添加以下代码后: "paths": { "src/*": ["src/*"] } 使用绝对导入时会抛出错误。 - kaijun
2
请问您能否解释一下为什么会这样?非常感谢! - Rafi Henig
有没有办法在导入时使用 "src/.." 路径? - Jacky
2
这不是一个好的解决方案,因为我想要使用“绝对路径”。 - Masih Jahangiri

70

删除dist文件夹,然后使用以下命令重新运行: npm run start:dev


非常感谢。Nest类似于Angular,但存在一些奇怪的问题,而Angular则没有。 - Marcin Pevik
3
这并没有回答问题,因为它在开发模式下运行应用程序,而不是生产模式。 - Felix Dolderer
这个对我有用,不过我不知道为什么。 - Aissam Jadli
那对我很有用。但为什么呢? - OhadBasan
这个对我有用,非常感谢。本来不需要修复的问题,否则我可能会花费无尽的时间去修复它。非常感谢。 - Ahmed Adewale
这对我也解决了问题。谢谢! - Dawid Dahl

5

我也曾因引用大写字母而遇到相同的问题,当文件名为小写字母时:

import { SomeClass } from './Some.class'; 

但是文件名为 some.class.ts

修复导入解决了错误。


我的眼睛因为盯着这个太久而变得发亮,如果没有你的建议,我永远也不会发现这个问题——谢谢! - 1252748
这是个很愚蠢的事情,但却非常有帮助!不确定为什么它会允许我在本地使用错误的大小写。 - undefined

4

请确保您的脚本指向 dist 文件夹内的 main.js。

"start:prod": "node dist/src/main"

3

一种解决方案

从tsconfig.json文件的compilerOptions中移除noEmit选项。


4
这会有什么帮助? - Shadoath

3
有时候错误可能是由SRC文件夹外的现有代码(例如Typeform迁移等)引起的,这会导致DIST内的编译进入一个文件夹级别(例如dist/migrations,dist/src),从而使主文件不在正确的位置。

3

我认为值得一提的是,将导入模块的js/ts文件放在src文件夹之外可能会在运行start:prod时引起问题。

我有一个用于使用Prisma ORM进行数据库种子填充的seed.ts文件,我将其移动到了src文件夹内并解决了这个问题。


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Goutham J.M
1
这正是我的问题所在,这是有效的,因为 src 文件夹之外的文件没有被你的 tsconfig 考虑在内,所以将由 prisma init 生成的种子文件从 prisma 文件夹移动到我的 src 文件夹中解决了错误。 - Chidiebere Nwachukwu

2
我通过删除生成的文件并重新创建,例如 dist 文件夹,解决了这个问题。

是的,这已经被说过了 - Liam

2
如果你的问题不涉及相对目录问题,那么尝试删除 dist 文件夹,然后再次尝试运行 npm run start:prod。如果你有一个 tsconfig.build.tsbuildinfo 文件,则也将其删除。

0

我忘记安装了 mikro-orm 所需的这两个包。安装后问题得到解决:

yarn add @mikro-orm/core @mikro-orm/nestjs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接