Невозможно отправить запросы POST из приложения Ioni c в бэкэнд Nest JS - PullRequest
1 голос
/ 27 марта 2020

Я установил простое приложение Ioni c 5 и бэкэнд Nest JS. Теперь я хочу отправить POST-запрос из своего приложения на сервер, но всегда получаю следующее сообщение об ошибке в консоли браузера:

Object {headers: {…}, status: 500, statusText : «Внутренняя ошибка сервера», url: «http://localhost: 3000 / api / users », ok: false, name: «HttpErrorResponse», сообщение: «Http error response для http://localhost : 3000 / api / users : 500 Internal Server Error ", ошибка: {…}} home.page.ts: 36: 14

В моем гнезде JS бэкэнд Я получаю это сообщение об ошибке:

[Nest] 18696 - 27.03.2020, 10:39:04 [ExceptionsHandler] Ошибка проверки пользователя: пароль: путь password требуется ., Имя пользователя: Путь username требуется., E-mail: Путь email требуется. + 43794ms

На вкладке сети браузера появляется сообщение об ошибке с кодом состояния 500 (внутренняя ошибка сервера):

Request URL: http://localhost:3000/api/users
Request method: POST
Remote address: 127.0.0.1: 3000
Status code:
500
Version: HTTP / 1.1
Referrer Policy: no-referrer-when-downgrade

Необходимые параметры также отправляются правильно:

{"email":"test@test.de","username":"testname","password":"testpassword"}

Контроллер для моих запросов POST имеет следующую структуру:

@Controller('/users')
export class UsersController {
    constructor(private usersService: UsersService) { }

    // POST request containing the data required to create a new user
    @Post()
    async createUser(@Res() res, @Body() createUserDto: CreateUserDto) {
        console.log('body', createUserDto);

        const user = await this.usersService.create(createUserDto);
        if (!user) throw new InternalServerErrorException('User could not be created!');
        return res.status(HttpStatus.OK).json({
            message: "User has been created successfully",
            user
        })
    }
...

Используемый DTO выглядит следующим образом:

export class CreateUserDto {
    readonly email: string;
    readonly username: string;
    readonly password: string;
}

CORS также активируется в моем бэкэнде Nest JS. Кроме того, забавно, что GET-запросы (через Ioni c, а также через Postman или прямой ввод в браузер) работают. POST-запросы также работают, если я делаю их через Postman или вводю их непосредственно в браузере.

Я тестирую POST-запрос таким образом в моем приложении Ioni c:

  ngOnInit() {
    this.createAccount(this.createUserDto).subscribe((res) => {
      console.log('Request send', res);
    }, (err) => {
      console.log('Failed', err);

    });
  }

  createAccount(credentials): Observable<any> {
    return this.http.post('http://localhost:3000/api/users', JSON.stringify(credentials));
  }

Также забавно, что запрос не отправляется, когда я удаляю JSON .stringify (учетные данные) и вводю просто учетные данные без JSON .stringify () .

Что я здесь не так делаю?

1 Ответ

2 голосов
/ 28 марта 2020

Если ваши «учетные данные» - это объект с правильным интерфейсом, просто отправьте его как есть без JSON .stringify ().

Я предполагаю, что учетные данные имеют что-то вроде этого:

const credentials = {
    email: 'foo@bar.biz',
    username: 'username',
    password: 'some_password',
}

Затем внесите небольшие изменения в наблюдаемую информацию, чтобы получить пользовательские данные и правильно отловить ошибки:

 createAccount(credentials): Observable<any> {
    return this.http.post('http://localhost:3000/api/users', credentials)
        .pipe(
           pluck('user'),
           catchError(err => {
            return throwError(err);
           })
        )
  }

Убедитесь, что импортированы операторы rx js 'pluck' и 'catchError 'и наблюдаемое' throwError '.

Для получения дополнительной информации об этих операторах:

Надеюсь, это сработает для вас! Удачи!

...