@zlodiak

Почему сервис не возвращает хэшированную строку?

Я написал сервис, который на основе пакета ts-md5 кодирует пароль алгоритмом md5:
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';

import { Md5 } from 'ts-md5/dist/md5';


@Injectable()
export class HashService {

  constructor() { }

  generate(str): Observable<string>{
    const h = Md5.hashStr(str);
    console.log(h, typeof h);
    return h;
  }

}


Из компонента я передаю в этот сервис строку и хотел и подписываюсь на ответ:
this.hashService.generate(this.form.value.password).subscribe((hash) => {
      console.log(hash);
    });


Проблема в том, что сервис не может возвратить ответ. Сообщение об ошибке в консоли следующее:
ERROR in src/app/shared/services/hash.service.ts(15,5): error TS2322: Type 'string | Int32Array' is not assignable to type 'Observable'.
Type 'string' is not assignable to type 'Observable'.


Я пробовал в сервисе указывать другой более общий тип:
generate(str): Observable<any>{

Но проблему это не решило.

Пробовал обходиться без сервиса и генерировать хэш в компонетне и затем выводить тип получаемого хэша через typeof . В результате получал тип "string"
  • Вопрос задан
  • 135 просмотров
Решения вопроса 1
StivinKing
@StivinKing
Потому что Вы возращаете string, а не Observable. Вот пример реализации - ссылка (только генерацию свою сделайте)
Вот пример с Вашей зависимостью ts-md5 - ссылка
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
theykillimmortal
@theykillimmortal
Здравствуйте.
Я предполагаю, это потому что по своей сути метод `hashStr()` возвращает тип string или Int32Array. Так написано в документации (https://www.npmjs.com/package/ts-md5)
`Md5.hashStr('blah blah blah') => hex:string`. Вы, возвращая результат отработки метода, соответственно возвращаете или string или Int32Array. А если быть точным, то string, так как нет второго переданного параметра.
Вам надо либо поменять сам метод:
generate(str): string {
    const h = Md5.hashStr(str);
    console.log(h, typeof h);
    return h;
  }

И в сервисе просто вызывать его:
console.log(this.hashService.generate(this.form.value.password));


Либо, если Вы хотите оставить возможность подписки на этот метод, обернуть метод generate в Observable.
generate(str): Observable<string> {
return Observable.create((observer) => {
    const h = Md5.hashStr(str);
    console.log(h, typeof h);
    observer.next(h);
    observer.complete();
  })
}


(для примера)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы