NestJS + Angular 项目抛出未找到模块:错误:无法解析“缓存管理器”
Posted
技术标签:
【中文标题】NestJS + Angular 项目抛出未找到模块:错误:无法解析“缓存管理器”【英文标题】:NestJS + Angular project throws Module not found: Error: Can't resolve 'cache-manager' 【发布时间】:2020-03-05 20:43:25 【问题描述】:我有一个 NestJS 后端 (6.9.0) 和 Angular 前端项目 (8.2.11)。 我在本地主机中同时使用并行启动前端和后端。
后端启动正常(启动速度更快),但是当 Angular 项目开始编译并准备好编译时,它会抛出以下错误:
任何想法为什么?
这之前运行良好,遗憾的是我无法准确确定是什么变化导致了这种行为。在 NestJS 中我没有使用 cli,我只使用 tsc 构建它。
WARNING in ../server/node_modules/@nestjs/common/utils/load-package.util.js 8:39-59
Critical dependency: the request of a dependency is an expression
ERROR in ../server/node_modules/@nestjs/common/cache/cache.providers.js
Module not found: Error: Can't resolve 'cache-manager' in '/mnt/c/codes/salesforce-compare/server/node_modules/@nestjs/common/cache'
ERROR in ../server/node_modules/@nestjs/common/pipes/validation.pipe.js
Module not found: Error: Can't resolve 'class-transformer' in '/mnt/c/codes/salesforce-compare/server/node_modules/@nestjs/common/pipes'
ERROR in ../server/node_modules/@nestjs/common/serializer/class-serializer.interceptor.js
Module not found: Error: Can't resolve 'class-transformer' in '/mnt/c/codes/salesforce-compare/server/node_modules/@nestjs/common/serializer'
ERROR in ../server/node_modules/@nestjs/common/pipes/validation.pipe.js
Module not found: Error: Can't resolve 'class-validator' in '/mnt/c/codes/salesforce-compare/server/node_modules/@nestjs/common/pipes'
【问题讨论】:
似乎当我构建角度项目时,它也开始构建nestjs项目。我有一个最顶层的文件夹,在该客户端、服务器和共享文件夹下,当我进入客户端文件夹并运行 ng serve 它还会编译服务器文件夹中的服务器项目。客户端和服务器文件夹中有单独的 node_module 文件夹。知道是什么原因造成的吗? 【参考方案1】:看起来你的一些 Nestjs 包是在 Angular 应用程序中导入的。
我也遇到过这个问题。在我的例子中,我使用来自@nestjs/swagger
的@ApiProperty
注释为后端和前端应用程序共享实体类。
【讨论】:
确实是问题所在。但接下来的问题是,我们如何共享实体,同时让 Swagger 根据需要工作? @Eugen 我的回答可以帮到你吗? 我也有同样的问题 在我的例子中,我做了一个@Inject()
,它拉入@Nestjs/common
而不是@Angular/common
【参考方案2】:
当尝试导入不是为合并到最终捆绑包中而设计的部分包时会发生这种情况(例如 @chshanovskiy 和我的情况下的 ApiProperty
)。
这是尝试混合 Nest.js 和基于 JS 的前端部分时的常见问题(在我的例子中:Nx 工作区中的 Angular),并且在 Nest 项目本身 here 中有一个有趣的讨论。
在仔细阅读并尝试了上一期中描述的策略后,我终于通过改变我构建依赖项的方式解决了这个问题,这里是关于我结束的工作文件系统的解释:
├── apps
│ ├── back // <- Nest.js app
│ ├── front // <- Angular app
├── libs
│ ├── back
│ │ ├── service-1 // <- Nest.js library (publishable)
│ ├── front
│ │ ├── service-1 // <- Angular library (NgRx feature, publishable)
│ ├── interfaces
│ │ ├── service-1 // <- Node.js library (publishable)
back / service-1
:Nest.js 库,使用 Swagger 注解(尤其是 ApiProperty
)。每个 DTO 类还实现了一个来自interfaces / service-1
的同源接口
front / service-1
:Angular 库调用 Nest.js API 并使用来自 interfaces / service-1
的类型指定其接口协定
interfaces / service-1
:独立的 Node.js 库导出需要在 back / service-1
和 front / service-1
之间共享的接口/类型
这样,后端和前端都依赖于相同的接口,无需在其他地方使用 Nest.js 部件,而是在它们自己的位置:back/*
库和应用程序。
【讨论】:
您是否也尝试了“externalDependencies”选项来解决此问题?以上是关于NestJS + Angular 项目抛出未找到模块:错误:无法解析“缓存管理器”的主要内容,如果未能解决你的问题,请参考以下文章