【问题标题】:Unable to get data from database to Angular无法从数据库获取数据到 Angular
【发布时间】:2021-08-01 21:57:16
【问题描述】:

所以我试图从我的后端 Python 获取数据,并且数据库在 SQLite 中,并在我的 Angular 前端。我认为我的功能正确,但是当我尝试打开页面时,它会收到以下错误消息: ERROR Error: Error trying to diff '[object Object]'. Only arrays and iterables are allowed 我对角度很陌生,所以任何可能导致此问题的帮助都会有所帮助。谢谢

这是我的 users.component.html:

<table class="table">
  <thead class="thead-dark">
  <tr>
    <th scope="col">ID</th>
    <th scope="col">Username</th>
    <th scope="col">Email</th>
  </tr>
  </thead>
  <tbody>
  <tr *ngFor="let user of userList">
    <td>{{user.ID}}</td>
    <td>{{user.username}}</td>
    <td>{{user.email}}</td>
  </tr>
  </tbody>
</table>

这是我的 users.component.ts:

import {Component, OnInit} from '@angular/core';
import {UserData} from "./users.model";
import {AppService} from "../app.service";

export interface UserData {
  ID: number;
  username: string;
  email: string;
}


@Component({
  selector: 'app-users',
  templateUrl: './users.component.html',
  styleUrls: ['./users.component.css']
})
export class UsersComponent implements OnInit {

  selectedUser?: UserData;

  userList: UserData[] = [];

  constructor(private appService: AppService) {
  }

  ngOnInit() {
    this.appService.getUsers().subscribe(
      response=>{
        this.userList=response
      }
    )
  }
}

编辑:应 rahals 的要求。这是postman中的get方法,获取用户的json:

"results": [
        {
            "id": 1,
            "first_name": "huh",
            "email": "damn@damn.com",
            "username": "damn"
        },
        {
            "id": 2,
            "first_name": "son",
            "email": "damnson@me.com",
            "username": "Administrator"
        },

【问题讨论】:

  • 您能否使用 PostMan 之类的工具提供从后端传入的数据样本
  • userList 必须是一个可迭代对象(例如数组),确保端点 USERS_URL 发出一个可迭代对象。
  • @serrulien 但 USERS_URL,这只是数据库的 url,我如何确保该部分发出一个可迭代的。 Rahal,我现在肯定会编辑它
  • 只需在后端返回一组对象,而不仅仅是 1 个用户对象。您不能将不可迭代的对象分配给数组。
  • @H3AR7B3A7 如果你能详细说明一下。我该怎么办?

标签: javascript angular typescript


【解决方案1】:

我把这个作为答案而不是leight cmets。

根据您的问题,我没有看到 Angular 代码有任何问题。可能问题在于来自后端的数据类型。 你瘦了,你得到了一个数组 ob 对象。但是你没有得到那种类型的数据,它是不同的。这就是为什么 Angular 无法识别对象的属性。最好的办法是

  1. 在浏览器中打开开发者工具(按 F12)
  2. 转到网络标签
  3. 然后刷新网页
  4. 您将看到每个请求的响应数据,然后单击 特定请求,您将确定问题。
  5. 您将看到类似于 的内容

6。检查您收到的响应,如果它不遵循 JSON 数组类型,那就是问题所在,您将需要从后端修复它

根据更新的问题,您应该如下更改代码,

    ngOnInit() {
    this.appService.getUsers().subscribe(
      response=>{
        this.userList=response.results
      }
    )
  }

【讨论】:

  • 我刚刚检查过了。现在有一堆东西,比如 localhost、main.js、runtime.js、websocket 和 users/。用户的内容类型是 application/json,状态码是 200 ok。这是否意味着它很好?还是我应该寻找其他东西?
  • 嗨@SikeYouTh 请参考我更新的asnwer
  • 刚刚解决了这个问题,是后端的分页器导致了这一切。它将列表包装在一个对象中。在我看来改变了分页器。在此处参考此问题以获得答案:stackoverflow.com/questions/32170442/…。不过感谢您的帮助,如果你们没有为我指出正确的方向,就不会弄清楚!
  • 很高兴您找到了答案,如果您认为我的回答对您有所帮助,请点赞 :)。祝你好运
  • 做到了,但我没有足够的代表来展示它,显然我需要超过 15 个,但反馈已记录:]
【解决方案2】:

您可以从 observable 中获取更多信息,这可以帮助您找出问题所在:

this.appService.getUsers().subscribe(
  response => { this.userList=response },
  err => console.log('HTTP Error', err),         // <-- Error handling
  () => console.log('HTTP request completed.')   // <-- Finally block
)

您可能希望确保您的后端返回的是某种用户的集合,而不仅仅是一个用户,您的问题不清楚是否是这种情况。

{      // <---- Object
            "id": 4,
            "first_name": "John",
            "email": "john.doe@me.com",
            "username": "JohnD"
}

这看起来像一个对象。

[     // <---- Array of objects
    {
            "id": 4,
            "first_name": "John",
            "email": "john.doe@me.com",
            "username": "JohnD"
    }
]

这是一个对象数组的样子。

"results": [     // <---- Object with a field results, containing an array of objects
    {
            "id": 4,
            "first_name": "John",
            "email": "john.doe@me.com",
            "username": "JohnD"
    }
]

你的数组好像被包裹了,像这样。

您的 getUsers() 函数不返回类型为 UserData[ ] 的 observable,而是类型为 { results: UserData[ ] }

【讨论】:

  • 因此,当我对邮递员运行 get 操作时,它会为我获取一些包含用户数据的 json。它应该是一个结果数组,它返回不同的 dicts(带有数据的 jsons)。现在我添加了您在那里编写的代码。当我检查页面时,我得到了与之前相同的错误,对象对象并且只允许使用数组和可迭代对象。最重要的是,我完成了 Http 请求。
  • 能否添加控制台输出的截图,或者复制粘贴确切的输出
  • 刚刚在我的帖子末尾添加了它。你可以去那里看看
  • 试试这个:this.userList = response.results,你的数组似乎被包裹在一个对象中。 XD 另外,Rahal 正在从您的控制台询问实际的调试信息。
  • 我假设您希望我将 .results 添加到响应行。它让我得到错误消息,结果在 UserData[] 中不存在
猜你喜欢
  • 2020-06-18
  • 2019-10-13
  • 2017-09-21
  • 1970-01-01
  • 2018-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多