#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;
}