Я сохраняю пользователя в базе данных.
Вот шаги, за которыми я следую
1) Подтверждение запроса.
2) хеширование пароля.
3) затем сохранение пользовательских данных в коллекции пользователей с хешированным паролем.
Итак, ниже у меня есть код, в котором я подписываюсь на метод hashPassword
, как только я получаю хеш-строку, создавая пользователя с хеш-строкой. подписка на метод save
и присвоение результата следующему методу наблюдателя.
Как мне сделать этот оператор zip()
или map()
вместо подписки снова и снова.
createUser(req: Request, res: Response): Observable<mongoose.Document> {
const body = req.body
const self = this
return singleObservable(Observable.create((observer: Observer<mongoose.Document>) => {
const errorMessage = new UserValidator(req).validateRequest()
if (errorMessage) {
observer.error(errorMessage)
} else {
self.hashPassword(req.body.password).subscribe(new BaseObserver(
(value) => {
const newUser = new this.userModule({ email: req.body.email, username: req.body.username, password: value })
this.save(newUser).subscribe(new BaseObserver((value) => {
observer.next(value)
}, (err) => {
observer.error(err)
}))
}, (error) => observer.error(error)))
}
}))
}
private hashPassword(password: string): Observable<string> {
return singleObservable(Observable.create((observer: Observer<string>) => {
bcrypt.hash(password, 10, (err, result) => {
result.length > 0 ? observer.next(result) : observer.error(err)
})
}))
}
save<T extends mongoose.Document>(model: mongoose.Document): Observable<T> {
return singleObservable(Observable.create(function (observer: Observer<mongoose.Document>) {
model.save(function (err, object) {
emitResult(observer, object, err)
})
}))
}
emitResult<T, E>(observer: Observer<T>, result: T | null, err: E) {
result ? observer.next(result) : observer.error(err);
}
singleObservable<T>(observable: Observable<T>) : Observable<T> {
return observable.pipe(first())
}