【问题标题】:Backend API completes successfully but NG not receiving anything后端 API 成功完成但 NG 没有收到任何内容
【发布时间】:2021-03-25 12:52:32
【问题描述】:

前端 Angular 应用程序将 GET 发送到后端节点 API 服务器。虽然 API 成功完成了这个 GET,但它的响应 res.status(200).send(data); 不会在 NG 调用者处触发断点,但 Chrome F12 网络选项卡显示有数据返回。

---- NG前端组件.ts:

import { Component, NgModule, OnInit } from '@angular/core';
import { mySvc } from '../mySvc.service';
import { record } from '../models/record';     

export class ListAllRecordsComponent implements OnInit {
    private allRecords: record[] = [];
    constructor(private mySvc: mySvc) {}
    ...
    public getAllRecords()
    {
      this.mySvc.getAllRecords().subscribe(response => this.allRecords = response, );
    }
}

---- NG mySvc.service.ts

import { record } from '../models/record';  
@Injectable()
export class mySvc {
    constructor(private http: HttpClient) { }
    const url = 'http://localhost:3000/somewhere';
    getAllRecords(): Observable<record[]>
    {
        return this.http.get(url)
            .pipe(
                map((data: any) => data.record),        // ??? break point is not triggered as expected when API sends back 200.
                catchError( error => { return throwError('bad')}) 
            ) 
    }

---- Node API 服务器控制器:

exports.pgGetAll = (req, res) =>
{
    objPS.pgGetAll( (err, data) =>
    {
        if (err)
            res.status(500).send(err.message);
        else
        {
            res.status(200).send(data);     // break point shows data has all records
        }
    });
}

---- objPS:

const pgGetAll = (cbFunc) => 
{
    pool.query('select * from "schema1"."table1"')
        .then
        (
            good =>
            {
                cbFunc(null, good)          // break point shows good has all records
            },
            bad =>
            {
                cbFunc(bad)
            }
        );
}

【问题讨论】:

  • 您能否展示如何使用服务中的 getAllRecords 方法?因为你应该在某处订阅 observable...
  • @bits 添加到帖子中,但如果可观察到没有得到任何东西,则与下游无关。
  • 浏览器的 devtools Network 部分的响应是什么?
  • 需要调试。您在应用程序中有任何拦截器吗?你现在尝试了什么?如果您收到浏览器的响应 - 从问题中删除后端 sn-ps,这会令人困惑。
  • 就在mySvc 中的地图操作员之前点击并尝试控制台记录数据对象。它可能会让您深入了解数据对象的结构。

标签: angular


【解决方案1】:

如果我没记错的话,你正在取回数据。如果您仅在断点方面遇到问题,请尝试使用映射数据的方法并在此处设置断点,而不是在 lambda 中设置:

map((data: any) => this.mapData(data))

定义这个新方法:

mapData(data: any) {
  return data.record; // set your breakpoint here
}

但几乎没有其他东西:“data.record”对我来说听起来不对,因为它应该提供不止一个记录,而不仅仅是一个,所以单数名称至少很有趣。

至少在mssql 包中,查询将返回data 中称为recordset 的对象。

这里有一个链接:https://www.npmjs.com/package/mssql#query-command-callback

【讨论】:

  • 断点在mapData() 内部工作!为什么它在 lambda 中不起作用?
  • 看这里的解决方案,希望对你有帮助,这似乎是一个尚未支持的调试器功能:stackoverflow.com/questions/30664151/…
【解决方案2】:

我认为您的问题与调试 Javascript lambda 表达式的方式有关。

请考虑阅读this SO 问题中接受的答案,我认为它将为您提供成功调试代码所需的所有信息。

【讨论】:

  • 接受的答案确实直接提供了解决方案,我只能给出“有用的提升”。非常感谢您的输入,并将阅读建议的答案。谢谢
  • 不客气@Jeb50,非常感谢。请不要担心,我知道这一点。我通常会尝试提供详细的答案,但我遇到了指定的问题,我认为它肯定会为您的问题提供很好的指导和很多解决方案。我希望它有所帮助。再次非常感谢您。
【解决方案3】:

我认为这应该可以解决它(摘自您的服务):

getAllRecords(): Observable<record[]>
    {
        return this.http.get<record[]>(url)
            .pipe(
                map((data: any) => data.record),      
                catchError( error => { return throwError('bad')}) 
            ) 
    }

我遇到了大约一百万次。

【讨论】:

  • 还是一样。
  • 你能分享一个样本吗?
  • 您可以尝试移除管道并检查它是否有效吗?
  • 完全移除整个管道。 return this.http.get&lt;record[]&gt;(url);
  • 我知道这不是一个好的答案,但请尝试从您的服务中的 getAllRecords() 中删除所有类型。如果它有效,至少你知道问题和解决什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-08
  • 1970-01-01
相关资源
最近更新 更多