Angular нет http-запроса при подписке через канал ()

#angular #http #angular2-observables

#angular #http #angular2-наблюдаемые

Вопрос:

Я новичок в angular и попытался проверить, существует ли имя пользователя, отправив http-запрос на мой сервер, но мой сервер не получает никаких запросов.

в моем сервисе:

 checkUsername(name: string): Observable<boolean> {
return this.http.get(
  `${this.api}/checkusername/${name}`
).pipe(
  catchError(this.errorHandler)
);
}
 

в моем валидаторе:

 export class UsernameExistsVallidatorService implements AsyncValidator{
constructor(private vs: VallidatorsService) { }

  validate(control: FormControl): Observable<ValidationErrors | null> {
    return this.vs.checkUsername(control.value).pipe(
      map(exists => (exists === false) ? null : {
          isbnExists: { valid: false }
      }),
      catchError(() => of(null))
    );
  }
}
 

На моем сервере:

 app.get("/api/checkusername/:name", (req: express.Request, res: express.Response) => {
  console.log(req.params.name);
  res.json({exists: false});
});
 

Как вы можете видеть, сервер печатает каждое имя, и на данный момент он отвечает {exists: false} .

Если я поставлю

 this.vs.checkUsername(control.value).subscribe(val => console.log(val));
 

внутри моей функции проверки сервер получает все правильно.

Ответ №1:

Для получения запроса от serve вам всегда нужно subscribe

http.post (and get, put, delete, etc) возвращает холодное Observable , т. Е. Observable для которого:

его базовый производитель создается и активируется во время подписки

Это означает, что функция, представленная наблюдаемым, активируется только с subscribe() помощью метода.

или

  post() : Promise<any> {
     return this.http.post(
       '/api, 
        {}
     ).toPromise();
 

или

 post() {
    var observable = this.http.post('/api', {})
        .map(response => response.json()) // in case you care about returned json       
        .publishReplay(); // would be .publish().replay() 
    observable.connect();
    return observable;
}