Гнездо js: невозможно положить, невозможно удалить (404 не найдено) - PullRequest
0 голосов
/ 04 мая 2020

У меня задача написать простую CRUD-программу для списка пользователей, следуя аналогичному примеру nest js. Хотя GET, POST и GET by id работают нормально, PUT и DELETE не работают должным образом. Я получаю «Пользователь не существует», однако пользователь существует в базе данных.

Контроллер

@Controller('users')
export class UsersController {
constructor(private userService: UsersService) {}
.....

//Update a user's details
@Put('/update')
async updateUser(
    @Res() res, 
    @Query('userid') userID, 
    @Body() createUserDto: CreateUserDto
) {
    const user = await this.userService.updateUser(userID, createUserDto);
    if (!user) throw new NotFoundException('User does not exist!');
    return res.status(HttpStatus.OK).json({
        message: 'User has been successfully updated',
        user
    })
}

//Delete a user
@ApiParam({ name: 'id' })
@Delete('/delete')
async deleteUser(@Res() res, @Query('userid') userID) {
    const user = await this.userService.deleteUser(userID);
    if (!user) throw new NotFoundException('Customer does not exist');
    return res.status(HttpStatus.OK).json({
        message: 'User has been deleted',
        user
    })
}   

Сервис

 // Edit user details
async updateUser(userID, createUserDto: CreateUserDto): Promise<User> {
    const updatedUser = await this.userModel
        .findByIdAndUpdate(userID, createUserDto, { new: true });
    return updatedUser;
}

// Delete a customer
async deleteUser(userID): Promise<any> {
    const deletedUser = await this.userModel
        .findByIdAndRemove(userID);
    return deletedUser; 
}

Я использую чванство для выполнения моих тестов. Я передаю идентификатор в качестве параметра для поиска и обновления пользователя.

1 Ответ

0 голосов
/ 05 мая 2020

Исходя из вашего репозитория кода, вы не используете параметры URL, а скорее используете параметры запроса. Разница между ними заключается в том, как они передаются на сервер и как их просят сервер прослушивать их.

Параметры запроса

С параметрами запроса вы передаете их на сервер. начиная с ? в URL и конкатенируя каждый последующий, используя &. Пример может выглядеть примерно так: http://localhost:3000?name=Test&id=a26408f3-69eb-4443-8af7-474b896a9e70. Обратите внимание, что есть два параметра Query, один с именем name и один с именем id. В Nest, чтобы получить эти параметры в вашем обработчике маршрута, вы должны использовать декоратор @Query(). Пример класса может выглядеть следующим образом:

@Controller()
export class AppController {

  @Get()
  getHello(@Query() query: { name: string, id: string }) {
    return `Hello ${name}, your ID is ${id}`;
  }
}

Обратите внимание на то, что с указанным выше URL вызываемый маршрут является базовым (/), с добавленными параметрами запроса.

Параметры URL

Параметры URL - это способ динамически строить маршруты без необходимости указывать каждый возможный URL. Это полезно для таких вещей, как идентификаторы, которые генерируются динамически. Принимая URL-адрес, аналогичный приведенному выше, образец URL на этот раз может выглядеть как http://localhost:3000/Test/a26408f3-69eb-4443-8af7-474b896a9e70. Обратите внимание, что на этот раз нет ? или &, и он выглядит как полный URL. Чтобы указать URL-параметры в гнезде, вам необходимо ввести двоеточие (:) перед именем параметра в декораторе объявления ресурсов вместе с любой другой необходимой частью пути. Затем, чтобы получить доступ к параметрам URL, вам нужно использовать декоратор @Param() в обработчике маршрута, аналогично тому, как вы использовали бы декоратор @Query(). Пример класса для этого будет

@Controller()
export class AppController {

  @Get(':name/:id')
  getHello(@Param() params: { name: string, id: string })
    return `Hello ${name}, your ID is ${id}`;
  }
}

Проблема и решение

В настоящее время вы вызываете http://localhost/users/update/<ID>, действуя так, как будто вы используете параметры URL, но в вашем обработчике маршрута вы ожидаем @Query() захватить идентификатор. Из-за этого нет обработчика для поиска /users/update/:id, и поэтому вы получаете 404 взамен. Вы можете либо изменить свой сервер для прослушивания параметров URL, как описано выше, либо изменить URL-адрес для отправки запроса с использованием параметров запроса вместо параметров URL.

...