【问题标题】:Get array from response instead of Object从响应而不是对象获取数组
【发布时间】:2020-03-28 06:04:46
【问题描述】:

我试图从我的数据库中仅获取特定项目,然后将其显示在表格中。

这就是我的 sql 查询的样子

public async aliasesListByDomain(req: Request, res: Response): Promise<void> {
    const { domain } = req.params;
    const aliases = await pool.query('SELECT * FROM virtual_aliases INNER JOIN virtual_domains ON virtual_aliases.domain_id = virtual_domains.id WHERE virtual_aliases.domain_id = ?', [domain]);
    if (aliases.length > 0) {
        res.json(aliases);
    } else {
        res.status(404).json({ message: "Alias doesn't exists" });
    }
}

有我的 Aliases.service

 getAliasesByDomain(domain: string): Observable<Alias> {
    return this.http.get(`${this.API_URI}/aliases/aliaseslistbydomain/${domain}`);
  }

还有我的组件

 getAliasesByDomain() {
    const token = this.getToken();
    let user;
    let domain;
    console.log(token);
    if(token){
      user = token.split('.')[1];
      user = window.atob(user);
      user = JSON.parse(user);
      domain = user.domain;

    }
    this.aliasesService.getAliasesByDomain(domain).subscribe(
      res => {
        this.alias = res;
      },
      err => console.error(err)
    );
  }

和组件html

<tr *ngFor="let aliases of alias;">

我的问题是我得到了错误:

AliasesListComponent.html:17 ERROR 错误:找不到不同的 支持对象 'to sa aliases: [object Object],[object Object]' 的 输入“字符串”。 NgFor 仅支持绑定到 Iterables,例如 数组。

因为我的响应是 Object 对象而不是数组。我该如何解析这个?

【问题讨论】:

  • 您可以在服务调用中使用 map rxjs 运算符,如果数据是 Object 对象类型,则解析数据。
  • 强烈建议对列表和数组使用复数形式,通过在上面的代码中使用this.alias,您会觉得它只包含一个单个别名,而不是一个别名列表.但是鉴于您的ngFor,它包含一个列表。所以应该是aliases

标签: javascript node.js angular typescript express


【解决方案1】:

如果你的回调给你一个数组,你可以像这样在服务中指定它

 getAliasesByDomain(domain: string): Observable<Alias[]> {
    return this.http.get<Alias[]>(`${this.API_URI}/aliases/aliaseslistbydomain/${domain}`);
  }

【讨论】:

  • 我应该这么说的:)我不会再这样做了:)
  • 我也应该说:不错,感谢发布。 :-) (那是我的赞成票,所以也许你明白了,但仍然......)
  • 抱歉英语不是我的母语 ;)
【解决方案2】:

如果服务器的响应与您期望的数据模型不匹配,您可以使用 rxjs 转换响应。

import { map } from 'rxjs/operators';

getAliasesByDomain(domain: string): Observable<Alias[]> {
    return this.http.get(`${this.API_URI}/aliases/aliaseslistbydomain/${domain}`).pipe(
        map((response: any) => {
            return transform(response);
        })
    );
}

transform(response: any): Alias[] {
    // your translation logic here
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    相关资源
    最近更新 更多