当前位置: 首页 > 知识库问答 >
问题:

http服务中可观察到的Angular2逐字符返回错误

东门子昂
2023-03-14

我正在为我的全堆栈应用程序构建一个angular2前端。我正在进行用户登录,我有这个功能,当提交登录表单时调用:

onSubmit(email, password) {
    this.userService.login(this.user.email, this.user.password).subscribe((result) => {
        console.log('reps' + result)
        if (result) {
            this.router.navigate(['']);
        }
    });
}

我的userService中的登录功能如下:

login(_email, _password) {
    let headers = new Headers({ 'Content-Type': 'application/json' });
    let options = new RequestOptions({ headers: headers });

    let data = { email: _email, password: _password };
    console.log(data);
    return this.http.post('/api/login', data, options)
        .map(this.extractData)
        .map((res) => {
            console.log('res' + JSON.stringify(res))
            if (res.token) {
                localStorage.setItem('auth_token', res.token);
                this.loggedIn = true;
            }
            return true;
        }).catch(this.handleError);
}

最后,handleError函数:

private handleError(error: Response | any) {
    // In a real world app, we might use a remote logging infrastructure
    console.log('isinError Handler' + error);
    let errMsg: string;
    if (error instanceof Response) {
        const err = error || JSON.stringify(error);
        console.log('err' + err); // Prints out "Response with status: 401 Unauthorized for URL: http://localhost:3000/api/login"
        errMsg = `${error.status} - ${error.statusText || ''} ${err}`;
    } else {
        errMsg = error.message ? error.message : error.toString();
    }
    console.error('msg' + errMsg); // Prints out "401 - Unauthorized Response with status: 401 Unauthorized for URL: http://localhost:3000/api/login"
    return errMsg;
}

当我提交错误的密码时,我会收到错误信息:

401-未经授权的响应,状态为:401未经授权的URL:http://localhost:3000/api/login

从我的错误处理程序中的errMsg变量打印。这很好,但是,回到我的组件中,我得到了resp4resp0resp1。。。打印出来。i、 e.一个字符接一个字符。我怎样才能让它以一个完整的字符串返回?

共有2个答案

朱阳晖
2023-03-14

你可能不会返回JSON。您可能正在使用字符串进行响应,它需要JSON。

在响应代码中执行类似操作。。

let json = JSON.parse(str);
res.send(json); // responding with parsed JSON
皇甫敏达
2023-03-14

运算符cat()将一个回调函数作为参数,该回调函数必须返回一个新的可观测对象,该对象将重新订阅并继续。

您从回调返回的只是一个字符串errMsg,因此您的代码相当于:

Observable.create(obs => {
        obs.next('r1');
        obs.next('r2');
        obs.next('r3');
        obs.error('error');
    })
    .catch(val => val)
    .subscribe(val => console.log(val));

它打印到控制台,因为在内部使用订阅ToResult()

r1
r2
r3
e
r
r
o
r

见现场演示:http://plnkr.co/edit/HODmdrNqRrw5ctSICktj?p=preview

如果要接收组件中的错误,则需要重新显示错误,然后在subscribe()方法上使用onError处理程序:

...
.catch(val => {
    throw val;
})
.subscribe(
    val => console.log(val),
    val => console.log('Error:', val)
);

请注意,在Angular2中,您使用的是RxJS 5,其catch()方法尚未出现在文档中,因此如果您阅读RxJS 4的原始文档,其行为可能会有所不同。

 类似资料:
  • 我已经用 我的服务就像 但是当我打电话的时候 它返回一个,它没有方法,它让我疯狂了好几个小时。我正在使用Babel来传输我的javascript代码。

  • 函数应该从get请求返回一个 在这种情况下,我只能在为真时执行请求,否则我在函数

  • 我正在使用adal-angular4库在angular 4单页应用程序中进行隐式流实现。这个应用程序调用一个web api来显示结果。这两个应用程序都托管在azure中(在一个特定的租户中),并进行了适当的注册,配置工作正常。

  • 最新消息 问题似乎是地图函数没有在“失败”的请求上运行。这意味着,如果我正在交谈的API返回一个错误(或其他4xx错误)Angular将把它视为失败,并导致观察者运行订阅的错误回调,跳过进程中的映射函数。 是否可以强制Angular将某些4xx错误视为成功的请求,或者强制map函数运行,即使Observable返回错误? 我有以下代码运行在我的Angular2应用程序: 代码执行得很好,只是没有启

  • 有人能向我解释一下为什么运算符可以接受返回或的函数吗? 官方文件说: FlatMap运算符通过将您指定的函数应用于源可观察对象发出的每个项目来转换可观察对象,其中该函数返回本身发出项目的可观察对象。 为什么它也可以返回数组? 例如,它们都是有效的: 但这不起作用:

  • 我有一个返回用户对象的角度服务。用户对象有自己的属性和一组墙。服务向调用组件返回一个可观察的。在该服务中,我能够从http服务返回的json创建用户对象。但是,当我订阅组件中的服务时,返回的对象为null。我做错了什么?