typescript - Hur man lägger till ett element i en array i ett MongoDB-dokument på Nest.js?


Jag känner mig extremt dum som ställer den här frågan, men det är första gången jag arbetar med Typescript i allmänhet och Nest.js i synnerhet. Jag arbetar med Nest, MongoDB (genom Mongoose) och Express.js.

Jag har två modeller: User och Post. För detta skulle den relevanta vara User:

import * as Mongoose from 'mongoose';

export const UserSchema = new Mongoose.Schema(
  {
    username: { type: String, required: true },
    posts: { type: [Mongoose.SchemaTypes.ObjectId], ref: 'Post' },
    favs: { type: [Mongoose.SchemaTypes.ObjectId], ref: 'Post' },
  },
  {
    timestamps: true,
  },
);

Jag skapar ett API för en Twitter-liknande app, där en användare kan skapa inlägg och lägga till dem i Favoriter. Jag följer handledningarna, som man gör när man är ny på en teknik, men jag har svårt att se hur man lägger till en ny favorit till användarens favoriter. Här är User-kontrollern hittills:

import {
  Controller,
  Get,
  Req,
  Res,
  HttpStatus,
  Put,
  NotFoundException,
  Param,
} from '@nestjs/common';
import { UserService } from './user.service';
import { Request, Response } from 'express';
import { CreateUserDTO } from './dto/create-user.dto';

@Controller('user')
export class UserController {
  constructor(private userService: UserService) {}

  //fetch an user
  @Get('userfavs/:userID')
  async getCustomer(@Res() res: Response, @Param('userID') userID: string) {
    const user = await this.userService.getUser(userID);

    if (!user) throw new NotFoundException('This user does not exist!');

    return res.status(HttpStatus.OK).json({
      username: user.username,

      favs: user.favs,
    });
  }

  @Put('addfav/:favID')
  async updateUser(
    @Req() req: Request,
    @Res() res: Response,
    @Param('favID') favID: string,
    @Body() createUserDTO: CreateUserDTO,
  ) {
    const user = await this.userService.updateUser(req.user._id, createUserDTO);
    if (!user) throw new NotFoundException('This user does not exist!');
    return res.status(HttpStatus.OK).json({
      message: 'Fav added successfully!',
    });
  }
}

Och servicen:

import { Injectable } from '@nestjs/common';
import { Model } from 'mongoose';
import { InjectModel } from '@nestjs/mongoose';
import { User } from './interfaces/user.interface';
import { CreateUserDTO } from './dto/create-user.dto';

@Injectable()
export class UserService {
  //creates Mongoose model for the User
  constructor(@InjectModel('User') private readonly userModel: Model<User>) {}

  //fetch a specific user - this will be useful to check favs
  async getUser(userID: string): Promise<User> {
    const user = await this.userModel
      .findById(userID)
      .populate('favs')
      .exec();
    return user;
  }

  //edit an specific user
  async updateUser(
    userID: string,
    createUserDTO: CreateUserDTO,
  ): Promise<User> {
    const updatedUser = await this.userModel.findByIdAndUpdate(
      userID,
      createUserDTO,
      { new: true },
    );
    return updatedUser;
  }
}

I Node.js skulle jag ha gjort så här:

User.findByIdAndUpdate(req.user._id, {
        $push: { favs: favId },
      })

Men i Nest får DTO mig på sned.

Svar #1

Med NestJS kan du hämta ditt dokument från Mongo med en find-operation (find, findById, findOne, etc). Sedan kan du ändra det objektet och spara. Du kan skicka ditt favId till din service från din controller istället för DTO:n. I din service:

async updateUser(
  userID: string,
  favId: string
): Promise < User > {
  const user = await this.userModel.findById(userID).exec();
  if (!user) {
    throw new NotFoundException();
  }

  user.favs.push(favId);
  return user.save();
}