node.js - Angular2 POST Observable 请求返回不可读的 JSON 对象

标签 node.js angular angular2-routing single-page-application

我正在使用带有 Observable 的 Angular2 POST 请求到 Node API。 我不断收到一个奇怪的 JSON 对象作为响应。

来自 Node API 应用程序的响应 - 通过 Chrome 控制台:

{"_isScalar":false,"source":{"_isScalar":false,"source":
{"_isScalar":false,"source":{"_isScalar":false},"operator":
{"delay":500,"scheduler":{"actions":[],"active":false}}},"operator":
{}},"operator":{"caught":"[Circular]"}}

Angular2 代码:

login2(): Observable<any> {

    this.url = 'http://localhost:3080/user/login';

    this.obj.email =  'jhon.doe@foo.de';
    this.obj.password = 'pass';

    let formObj = this.form.getRawValue();
    let serializedForm = JSON.stringify(formObj);

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

    var obsRequest = this.http.post(this.url, this.obj, options)
        .map(res => res.json())
        .catch( (error: any) => Observable.throw(error.json().error || 'Server error') );


    console.log(JSON.stringify(obsRequest, this.avoidCircular(obsRequest)));

    return obsRequest;
}

附注avoidCircular 是 javaScript 内置 JSON.stringify 的额外解决方法,因为当我不使用它时会出现以下错误:

TypeError: Converting circular structure to JSON

避免循环代码:

avoidCircular(objCens) {
    var i = 0;
    return function(k, v) {
        if(i !== 0 && typeof(objCens) === 'object' && typeof(v) == 'object' && objCens == v) 
        return '[Circular]'; 
        if(i >= 29) 
        return '[Unknown]';
        ++i; 
        return v;  
    }
}

API 调用通过 Postman 工作正常!

知道如何解决这个问题吗?

最佳答案

obsRequest 不是您请求的响应,而是可观察的请求。为了接收响应,您需要订阅

var obsRequest = this.http.post(this.url, this.obj, options)
        .map(res => res.json())
        .catch( (error: any) => Observable.throw(error.json().error || 'Server error') );

obsRequest.subscribe((response)=> console.log(response));

建议您阅读官方文档的http模块:https://angular.io/guide/http

关于node.js - Angular2 POST Observable 请求返回不可读的 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45030702/

相关文章:

node.js - 用 Mongoose 填充后如何聚合

Angular APP_INITIALIZER 是否在延迟加载的模块中工作

twitter-bootstrap - 如何使用 ng2-bootstrap 从 Bootstrap 3 切换到 Bootstrap 4?

angular - 如何路由到模块作为模块的子级 - Angular 2 RC 5

angular - Angular 2路由器中间的通配符选择器

javascript - 在 Angular 2 中的应用程序模板之外定义路由链接

node.js - 在 SemaphoreCI 上升级 NodeJS

Node.js - 从 facebook graph api 获取我的帐户详细信息

javascript - 在 Node.js 服务器和浏览器之间共享二进制缓冲区

angular - 什么时候使用 Ngzone.run()?