我如何使Angular HTTP Post等待节点js响应

问题描述 投票:0回答:1

我是Angular / Node JS的新手,我正在做一个大学项目,试图在前端和后端实现授权/身份验证。

因此,我在Node JS中创建了Login方法,并用邮递员测试了响应,这是我想要的。但是当我发送调用Angular中的方法login时,它不会返回任何内容。

使用调试,我可以观察到角度不等待Node JS的响应,如何使它仅在响应到达时才继续?

Node JS方法

exports.cliente_login = function (req, res){
    let cliente = transform.ToLogin(req);
    service.ClienteLogin(cliente, function (cliente, erro) {
        if (cliente) {
            res.json(cliente);
        } else {
        return res.send(erro);
        }
    })

角服务方法

loginCliente(cliente): Observable<Cliente> {
    return this.http.post<Cliente>(this.myAppUrl + this.myApiUrl + 'login', JSON.stringify(cliente), this.httpOptions)
      .pipe(
        retry(1),
        catchError(this.errorHandler)
      );
  }

角度认证方法

login(email: string, password: string) {
    let user: any;
    let userLogin = new UserToLogin();
    userLogin.email = email;
    userLogin.password = password;

    user =  this.clienteService.loginCliente(userLogin);
    if (user && user.token) {
      // store user details and jwt token in local storage to keep user logged in between page refreshes
      localStorage.setItem('currentUser', JSON.stringify(user));
      this.currentUserSubject.next(user);
    }

    return user;
  }

谢谢您的帮助!

node.js angular authentication authorization
1个回答
0
投票

您可能需要订阅您的http输出,因为这是可观察的:

验证方法:

login(email: string, password: string) {
    let user: any;
    let userLogin = new UserToLogin();
    userLogin.email = email;
    userLogin.password = password;

    this.clienteService.loginCliente(userLogin).subscribe((user) => {
          if (user && user.token) {
            // store user details and jwt token in local storage to keep user logged in between page refreshes
            localStorage.setItem('currentUser', JSON.stringify(user));
            this.currentUserSubject.next(user);
         }

         return user;
      });
  }


0
投票

Angular HTTPClient基于可观察对象。该请求仅在您订阅时触发。

login(email: string, password: string) {
    let user: any;
    let userLogin = new UserToLogin();
    userLogin.email = email;
    userLogin.password = password;

    this.clienteService.loginCliente(userLogin).subscribe(user => {

        if (user && user.token) {
        // store user details and jwt token in local storage to keep user logged in between page refreshes
        localStorage.setItem('currentUser', JSON.stringify(user));
        this.currentUserSubject.next(user);
    }
    });

    // You cannot return user here, as it is only available inside your subscribe block which is running asynchronously
    // return user;
}

0
投票

使用async/await

尝试使用此代码块

async loginCliente(cliente): Observable<Cliente> {
    return await this.http.post<Cliente>(this.myAppUrl + this.myApiUrl + 'login', JSON.stringify(cliente), this.httpOptions).toPromise();
  }

这将把您的可观察性转化为承诺,然后。您的代码将等待,直到服务器收到响应。

© www.soinside.com 2019 - 2024. All rights reserved.