使用 Nestjs/Angular 初始化 MongoDB 时出错

Posted

技术标签:

【中文标题】使用 Nestjs/Angular 初始化 MongoDB 时出错【英文标题】:Errors while initializing MongoDB with Nestjs/Angular 【发布时间】:2021-03-13 18:38:45 【问题描述】:

经过一番努力,我终于来到了这里,但没有成功。我学习 Nestjs/Angular/MongoDB。到目前为止,我成功地同时运行了 Angular 服务器和 Nestjs 服务器。但是当我用它们初始化 mongoDB 时,我得到了大量的错误 147(主要与模式有关)。

似乎错误与我的代码无关,而是安装依赖项。在任何情况下,我都会在下面复制我的代码。我在 ubuntu 和 windows 上都尝试了这个应用程序。但同样的错误仍然存​​在。

app.controller.ts:

import  Controller, Get  from '@nestjs/common';
import  AppService  from './app.service';

@Controller()
 export class AppController 
 constructor(private readonly appService: AppService) 

@Get()
 healthCheck(): string 
  return this.appService.appStatus();
  

App.module.ts

import  Module  from '@nestjs/common';
import  MongooseModule  from '@nestjs/mongoose';
import  AppController  from './app.controller';
import  AppService  from './app.service';
import  config  from './config';

@Module(
  imports: [
    MongooseModule.forRoot(config.mongoUri, 
      useNewUrlParser: true,
      useUnifiedTopology: true,
      useCreateIndex: true,
    ),
  ],
  controllers: [AppController],
  providers: [AppService],
)
export class AppModule 

app.service.ts

import  Injectable  from '@nestjs/common';
import  InjectConnection  from '@nestjs/mongoose';
import  Connection  from 'mongoose';
import  config  from './config';

@Injectable()
export class AppService 
  constructor(@InjectConnection() private connection: Connection) 
   appStatus(): string 
   return `$config.appName is running in port $config.port. Connected to 
    $this.connection.name`;
  

config.ts

import * as dotenv from 'dotenv';

const result = dotenv.config();

 if (result?.error) 
 throw new Error('Add .env file');


export const config = 
  env: process.env.SZ_ENV,
  appName: process.env.SZ_APP,
  port: process.env.SZ_PORT,
  mongoUri:  
 `mongodb+srv://$process.env.SZ_MONGO_USER:$process.env.SZ_MONGO_PASS@
  $process.env.SZ_MONGO_HOST/$process.env.SZ_MONGO_DB 
  authSource=admin&replicaSet=$process.env.SZ_MONGO_REPLICA&
  readPreference=primary&ssl=true`,
  ;

main.ts

import  NestFactory  from '@nestjs/core';
import  AppModule  from './app.module';
import  config  from './config';

 async function bootstrap() 
  const  appName, port  = config;
  const app = await NestFactory.create(AppModule);
  await app.listen(port, () => 
    console.info(`$appName is running in http://localhost:$port`);
  );
 
bootstrap();

错误:当纱线启动时:服务器

[8:16:58 PM] Starting compilation in watch mode...

node_modules/@nestjs/mongoose/dist/factories/schema.factory.d.ts:4:60 - error TS2315: Type 
'Schema' is not generic.

4     static createForClass<T = any>(target: Type<unknown>): mongoose.Schema<T>;
                                                         ~~~~~~~~~~~~~~~~~~
node_modules/@types/mongoose/index.d.ts:79:1 - error TS6200: Definitions of the following 
identifiers conflict with those in another file: DocumentDefinition, FilterQuery, 
UpdateQuery, NativeError, Mongoose, CastError, Collection, Connection, Error, QueryCursor, 
VirtualType, Schema, Subdocument, Array, DocumentArray, Buffer, ObjectId, Decimal128, Map, 
Aggregate, SchemaType, Document

79     declare module "mongoose" 

 node_modules/mongoose/index.d.ts:1:1
 1 declare module "mongoose" 
   ~~~~~~~
 Conflicts are in this file.

 node_modules/@types/mongoose/index.d.ts:226:14 - error TS2403: Subsequent variable 
 declarations must have the same type.  Variable 'SchemaTypes' must be of type 'typeof 
 Types', but here has type 'typeof Types'.

 226   export var SchemaTypes: typeof Schema.Types;
              ~~~~~~~~~~~

 node_modules/mongoose/index.d.ts:45:14
 45   export var SchemaTypes: typeof Schema.Types;
                 ~~~~~~~~~~~
 'SchemaTypes' was also declared here.

 node_modules/@types/mongoose/index.d.ts:822:24 - error TS2314: Generic type 
 'Query<ResultType, DocType, T>' requires 3 type argument(s).

 822     constructor(query: Query<T>, options: any);
                        ~~~~~~~~

 node_modules/@types/mongoose/index.d.ts:1013:19 - error TS2314: Generic type 
 'Query<ResultType, DocType, T>' requires 3 type argument(s).

 1013     pre<T extends Query<any> = Query<any>>(
                    ~~~~~~~~~~

 node_modules/@types/mongoose/index.d.ts:1013:32 - error TS2314: Generic type 
 'Query<ResultType, DocType, T>' requires 3 type argument(s).

 1013     pre<T extends Query<any> = Query<any>>(
                                 ~~~~~~~~~~

 node_modules/@types/mongoose/index.d.ts:1036:48 - error TS2314: Generic type 
 'Query<ResultType, DocType, T>' requires 3 type argument(s).

 1036     pre<T extends Document | Model<Document> | Query<any> | Aggregate<any>>(
                                                 ~~~~~~~~~~

 node_modules/@types/mongoose/index.d.ts:1048:19 - error TS2314: Generic type 
 'Query<ResultType, DocType, T>' requires 3 type argument(s).

 1048     pre<T extends Query<any> = Query<any>>(
                    ~~~~~~~~~~

 node_modules/@types/mongoose/index.d.ts:1048:32 - error TS2314: Generic type 
 'Query<ResultType, DocType, T>' requires 3 type argument(s).

 1048     pre<T extends Query<any> = Query<any>>(
                                 ~~~~~~~~~~

 node_modules/@types/mongoose/index.d.ts:1074:48 - error TS2314: Generic type 
 'Query<ResultType, DocType, T>' requires 3 type argument(s).

 1074     pre<T extends Document | Model<Document> | Query<any> | Aggregate<any>>(
                                                 ~~~~~~~~~~

 node_modules/@types/mongoose/index.d.ts:1264:5 - error TS2374: Duplicate string index 
 signature.

 1264     [path: string]: SchemaTypeOpts<any> | Schema | SchemaType;
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 node_modules/@types/mongoose/index.d.ts:1627:76 - error TS2314: Generic type 
'Query<ResultType, 
   DocType, T>' requires 3 type argument(s).

 1627     replaceOne(replacement: any, callback?: (err: any, raw: any) => void): Query<any>;

【问题讨论】:

【参考方案1】:

这很可能与添加了自己的类型的Mongoose v5.11.0 有关。恢复到 v5.10.x 应该可以修复它

【讨论】:

我认为我使用的不是更高版本。这些是来自 pck.json 的 mongoose 依赖项。 “依赖项”:“猫鼬”:“^5.9.23”,“@nestjs/mongoose”:“^7.0.2”,“devDependencies”:“@types/mongoose”:“^5.7.31”, 您可以通过运行npm ls --depth=0 | grep mongooseyarn list --depth=0 | grep mongoose 来检查版本。使用^5.9.23表示只要在5.9以上就使用5.x.x,因为^表示这个版本或以上的次要版本 Tks,仍然得到:MongooseModule] 无法连接到数据库。重试(3)... +3006ms,虽然我降级到 5.10.2。还有什么帮助吗? 您可以让它数到九 (9),它会打印出问题。查看您的配置,您可能缺少查询参数的 ? 为了防止将 Mongoose 更新为 &gt; 5.11.x,您可以将 package.json 中的 "mongoose": "^5.10.x" 更改为 "mongoose": "~5.10.x"【参考方案2】:

我也遇到了同样的问题,所以我发现这是由于我在 package.json 中描述的 mongoose 版本 "version": "5.11.2" 造成的。遇到此问题时创建了一个 index.d.ts 文件。 我将其更改为 "mongoose": "~5.10.11" 并安装了 "version": "5.10.19" 它工作正常。

不知道他们发布的最新版本可能存在什么问题,但仍存在错误。

【讨论】:

更新 package.json 之后你接下来做了什么?制作任何与 yarn / npm update 或其他相关的命令?因为 index.d.ts 不能自己创建,至少在我的情况下不是 @TheKash 我再次安装了依赖项。删除 node_modules 和 package-lock 后运行命令 npm install【参考方案3】:

我也有这个错误,并且更改依赖项(猫鼬)不起作用。 只需将其添加到 tsconfig.json 中的 compilerOptions

"skipLibCheck": true

也许这是不好的做法,但是...

【讨论】:

【参考方案4】:

新的 mongoose v5.11.x 发布了自己的类型定义,所以你不应该再使用 @types/mongoose https://github.com/Automattic/mongoose/issues/9606#issuecomment-736710621

【讨论】:

以上是关于使用 Nestjs/Angular 初始化 MongoDB 时出错的主要内容,如果未能解决你的问题,请参考以下文章

NRWL + NestJS 尝试使用 Swagger 插件

如何在 DTO 中定义 ObjectId 以及在 NestJS Mongoose 中获取关系数据的正确查询是啥?

Ceph Nautilus安装配置 MGR-dashboard

awk数组函数脚本

如何更改完整的日历视图

使用 Db2Mon 有没有办法区分使用类型 2 和类型 4 驱动程序连接的客户端?