Reputation: 21
I have a problem that really makes me go round in circles since. I try to set up a Nest & Mongo project base to save time for the dev on the mongo NestJs couple. The elements are as follows:
// Package.json
{
"dependencies": {
"@nestjs/common": "^10.4.4",
"@nestjs/config": "^3.2.3",
"@nestjs/core": "^10.4.4",
"@nestjs/jwt": "^10.2.0",
"@nestjs/mapped-types": "^2.0.5",
"@nestjs/mongoose": "^10.0.10",
"@nestjs/passport": "^10.0.3",
"@nestjs/platform-express": "^10.4.4",
"@nestjs/swagger": "^7.4.2",
"@nestjs/throttler": "^6.2.1",
"@types/bcrypt": "^5.0.2",
"@types/eslint": "^9.6.1",
"@types/estree": "^1.0.6",
"bcrypt": "^5.1.1",
"class-transformer": "0.5.1",
"class-validator": "^0.14.1",
"dotenv": "^16.4.5",
"dotenv-expand": "^11.0.6",
"express": "^4.21.1",
"git-cz": "^4.9.0",
"jsonwebtoken": "^9.0.2",
"moment": "^2.30.1",
"mongoose": "^8.7.1",
"mongoose-tsgen": "^8.4.10",
"passport": "^0.7.0",
"passport-jwt": "^4.0.1",
"reflect-metadata": "^0.1.14",
"rimraf": "^6.0.1",
"rxjs": "^7.8.1"
},
"devDependencies": {
"@nestjs/cli": "^7.6.0",
"@nestjs/schematics": "^7.3.1",
"@nestjs/testing": "^7.6.18",
"@types/crypto-random-string": "^2.0.0",
"@types/express": "^4.17.21",
"@types/jest": "^26.0.24",
"@types/jsonwebtoken": "^8.5.9",
"@types/mongoose": "^5.11.97",
"@types/node": "^14.18.63",
"@types/supertest": "^2.0.16",
"@typescript-eslint/eslint-plugin": "^4.33.0",
"@typescript-eslint/parser": "^4.33.0",
"eslint": "^9.12.0",
"eslint-config-prettier": "^8.10.0",
"eslint-plugin-prettier": "^3.4.1",
"install": "^0.13.0",
"jest": "^26.6.3",
"mongodb-memory-server": "^6.9.6",
"mongoose-dummy": "^1.0.8",
"prettier": "^2.8.8",
"supertest": "^6.3.4",
"ts-jest": "^26.5.6",
"ts-loader": "^8.4.0",
"ts-node": "^9.1.1",
"tsconfig-paths": "^3.15.0",
"typescript": "^4.9.5"
},
"jest": {
"moduleFileExtensions": [
"js",
"json",
"ts"
],
"rootDir": "src",
"testRegex": ".*\\.spec\\.ts$",
"transform": {
"^.+\\.(t|j)s$": "ts-jest"
},
"collectCoverageFrom": [
"**/*.(t|j)s"
],
"coverageDirectory": "../coverage",
"testEnvironment": "node"
}
}
//user.controller.ts
@Controller('users')
export class UsersController {
constructor(private usersService: UsersService) { }
@UseGuards(JwtAuthGuard)
@Get()
async findAll(
@Res() res: Response,
@HeaderDto() headersDto: HeadersDto,
@QueryDto() getAllFilter: FindAllQueryFilter,
): Promise<Response<User[]>> {
const aggregationResult = await this.usersService.findAll(getAllFilter, headersDto);
res.header('x-count', String(aggregationResult.count));
return res.send(aggregationResult.results);
}
....
//users.service.ts
@Injectable()
export class UsersService {
constructor(@InjectModel(User.name) private userModel: Model<UserDocument>, private readonly tokensService: TokensService,) { }
async findAll(
getAllFilter?: FindAllQueryFilter,
aggregationOptions?: AggregationOptions,
): Promise<AggregationResult<User>> {
return await aggregateBuilder(this.userModel, getAllFilter, aggregationOptions);
}
//HeaderDTO
import {
Body,
createParamDecorator,
ExecutionContext,
HttpException,
HttpStatus,
Query,
ValidationPipe,
} from '@nestjs/common';
import { plainToInstance } from 'class-transformer';
import { validate, ValidationError } from 'class-validator';
export const BodyDto = (): ParameterDecorator => Body(new ValidationPipe({ transform: true, whitelist: true }));
export const QueryDto = (): ParameterDecorator => Query(new ValidationPipe({ transform: true, whitelist: true }));
export const HeaderDto = createParamDecorator(async (value: any, ctx: ExecutionContext) => {
// extract headers
const headers = ctx.switchToHttp().getRequest().headers;
// Convert headers to DTO object
const dto = plainToInstance(value, headers);
// Validate
const errors: ValidationError[] = await validate(dto);
if (errors.length > 0) {
//Get the errors and push to custom array
const validationErrors = errors.map((obj) => Object.values(obj.constraints));
throw new HttpException(`Validation failed with following Errors: ${validationErrors}`, HttpStatus.BAD_REQUEST);
}
// return header dto object
return dto;
})
;
When I do a Get:id, I have no problem, but when it comes to a getAll, I have this problem:
>[Nest] 32901 - 11/10/2024 11:45:21 ERROR [ExceptionsHandler] this.removeListener is not a function
TypeError: this.removeListener is not a function
at Object.socketOnError [as error] (node:_http_server:867:8)
at TransformOperationExecutor.transform (/Users/amar/Projects/BASE_PROJECTS/nestjs-template/node_modules/.pnpm/[email protected]/node_modules/class-transformer/cjs/TransformOperationExecutor.js:192:51)
at TransformOperationExecutor.transform (/Users/amar/Projects/BASE_PROJECTS/nestjs-template/node_modules/.pnpm/[email protected]/node_modules/class-transformer/cjs/TransformOperationExecutor.js:291:43)
at TransformOperationExecutor.transform (/Users/amar/Projects/BASE_PROJECTS/nestjs-template/node_modules/.pnpm/[email protected]/node_modules/class-transformer/cjs/TransformOperationExecutor.js:291:43)
at TransformOperationExecutor.transform (/Users/amar/Projects/BASE_PROJECTS/nestjs-template/node_modules/.pnpm/[email protected]/node_modules/class-transformer/cjs/TransformOperationExecutor.js:291:43)
at ClassTransformer.instanceToPlain (/Users/amar/Projects/BASE_PROJECTS/nestjs-template/node_modules/.pnpm/[email protected]/node_modules/class-transformer/cjs/ClassTransformer.js:13:25)
at Object.classToPlain (/Users/amar/Projects/BASE_PROJECTS/nestjs-template/node_modules/.pnpm/[email protected]/node_modules/class-transformer/cjs/index.js:22:29)
at ClassSerializerInterceptor.transformToPlain (/Users/amar/Projects/BASE_PROJECTS/nestjs-template/node_modules/.pnpm/@[email protected][email protected][email protected][email protected][email protected]/node_modules/@nestjs/common/serializer/class-serializer.interceptor.js:56:37)
at ClassSerializerInterceptor.serialize (/Users/amar/Projects/BASE_PROJECTS/nestjs-template/node_modules/.pnpm/@[email protected][email protected][email protected][email protected][email protected]/node_modules/@nestjs/common/serializer/class-serializer.interceptor.js:49:20)
at /Users/amar/Projects/BASE_PROJECTS/nestjs-template/node_modules/.pnpm/@[email protected][email protected][email protected][email protected][email protected]/node_modules/@nestjs/common/serializer/class-serializer.interceptor.js:38:54
node:internal/assert:14
throw new ERR_INTERNAL_ASSERTION(message);
^
Error [ERR_INTERNAL_ASSERTION]: This is caused by either a bug in Node.js or incorrect usage of Node.js internals.
Please open an issue with this stack trace at https://github.com/nodejs/node/issues
at assert (node:internal/assert:14:11)
at ServerResponse.detachSocket (node:_http_server:294:3)
at resOnFinish (node:_http_server:988:7)
at ServerResponse.emit (node:events:519:28)
at onFinish (node:_http_outgoing:1062:10)
at callback (node:internal/streams/writable:757:21)
at afterWrite (node:internal/streams/writable:701:5)
at afterWriteTick (node:internal/streams/writable:687:10)
at process.processTicksAndRejections (node:internal/process/task_queues:81:21) {
code: 'ERR_INTERNAL_ASSERTION'
}
Node.js v21.6.2
You have an idea, besides I reinstalled the packages
Upvotes: 0
Views: 87