【问题标题】:ERROR TypeError: Cannot read property 'data' of undefined错误类型错误:无法读取未定义的属性“数据”
【发布时间】:2020-09-07 03:38:25
【问题描述】:

我是 Angular 和 mongodb 的新手。我正在尝试从 MongoDB 中提取数据并将其显示在 Angular Material Table 中。 但是我遇到了错误

“错误类型错误:无法读取未定义的属性‘数据’”

当我试图打开应用程序时,MongoDB 中的数据将无法加载。 我设法缩小与这条线有关的问题。

return this.myservice.GetList().subscribe(res => this.dataSource.data = res["0"]["data"]);
                                                                                ^^^^^^^^

提前致谢!

tabledata.component.ts

import {BackendService} from './../backend.service';
import {Component, OnInit, ViewChild} from '@angular/core';
import {MatPaginator} from '@angular/material/paginator';
import {MatSort} from '@angular/material/sort';
import {MatTableDataSource} from '@angular/material/table';


@Component({
  selector: 'tabledata',
  templateUrl: './tabledata.component.html',
  styleUrls: ['./tabledata.component.css']
})

export class TabledataComponent implements OnInit {
  displayedColumns = ['S_NAME', 'S_ADD', 'S_STATUS'];
  dataSource = new MatTableDataSource();

  @ViewChild(MatPaginator, {static: true}) paginator: MatPaginator;
  @ViewChild(MatSort, {static: true}) sort: MatSort;

  constructor(private myservice: BackendService) {
  }



  ngOnInit() {

    return this.myservice.GetList().subscribe(res => this.dataSource.data = res["0"]["data"]);

  }

  ngAfterViewInit() {
    this.dataSource.paginator = this.paginator;
    this.dataSource.sort = this.sort;
  }

  applyFilter(filterValue: string) {
    this.dataSource.filter = filterValue.trim().toLowerCase();

    if (this.dataSource.paginator) {
      this.dataSource.paginator.firstPage();
    }
  }
}

站点列表集合中的 MongoDB 数据

{
    "_id" : ObjectId("5ec4672e44f01dcae82c3dde"),
    "error" : "0",
    "num_rows" : 3,
    "data" : [ 
        {
            "S_NAME" : "SBOBETH",
            "S_ADD" : "sbobeth.com",
            "S_STATUS" : "UP"
        }, 
        {
            "S_NAME" : "GTRCASINO",
            "S_ADD" : "gtrcasino.com",
            "S_STATUS" : "DOWN"
        }, 
        {
            "S_NAME" : "SBOBETH",
            "S_ADD" : "sbobeth.com",
            "S_STATUS" : "DOWN"
        }, 
        {
            "S_NAME" : "GTRBETCLUB",
            "S_ADD" : "gtrbetclub.com",
            "S_STATUS" : "UP"
        }, 
        {
            "S_NAME" : "77UP",
            "S_ADD" : "77up.bet.com",
            "S_STATUS" : "UP"
        }, 
        {
            "S_NAME" : "DATABET88",
            "S_ADD" : "databet88.net",
            "S_STATUS" : "DOWN"
        }, 
        {
            "S_NAME" : "FAFA855",
            "S_ADD" : "fafa855.com",
            "S_STATUS" : "UP"
        }
    ]
}

backend.service.ts

import { Injectable } from '@angular/core';
import { HttpClient, HttpResponse, HttpHeaders, HttpRequest  } from "@angular/common/http";
import { catchError, map, tap,  } from 'rxjs/operators';

@Injectable({
  providedIn: 'root'
})
export class BackendService {

  constructor(private _http: HttpClient) { }

  GetList() 
  {

    return this._http.get('http://localhost:3000/api/getList')

  }

  private handleError<T>(operation = 'operation', result?: T)
  {
    console.log("error");
    return null;
  }

  private log(message: string)
  {
    console.log("log");
  }

}

server.js

const express = require('express');
const bodyParser = require('body-parser');
const app = express();
var mongoose = require('mongoose');
require('./db')                                                                         
const SLDBModel = require('./sldbreply_schema');                                        

app.use(bodyParser.urlencoded({ extended: true }));
app.use(express.urlencoded({ extended: true }))

app.use(function (req, res, next)
{
    res.setHeader('Access-Control-Allow-Origin','*');
    res.setHeader('Access-Control-Allow-Methods','GET, POST, PUT, DELETE');
    res.setHeader('Access-Control-Allow-Headers','content-type, x-access-token');
    res.setHeader('Access-Control-Allow-Credentials', true);
    next();
});

app.get('/api/getList', function(req, res){
    SLDBModel.find({},function(err,data){
        if(err)
        {
            res.send(err);
        }
        else
        {
            res.send(data);
        }
    });
})

app.listen(3000, ()=>
{
    console.log("SERVER IS ONLINE!");
})

在我尝试了 console.log(res);从评论中的建议首先检查我的“res”数据。

从 server.js 我尝试了 console.log(data);

他们都返回 [] 不确定这是什么意思 关于如何解决的任何建议?

【问题讨论】:

  • 响应数据是什么?如果它如“站点列表集合中的 MongoDB 数据”中所述,则该对象不是列表。 res[0] 你想让 res["data"][0] 得到第一个结果
  • 检查您的 res["0"] 是否包含键名 ddata,可能是响应数据有问题。检查 GetList 服务以获取它返回的数据。
  • 我认为你是对的,我的 mongo 收藏是问题所在。我试过 console.log(res);但它什么也没回复我

标签: angular mongodb


【解决方案1】:

尝试在您的服务器端也将数据转换为 Json

app.get('/api/getList', function(req, res){
SLDBModel.find({},function(err,data){
    if(err)
    {
        res.send(err);
    }
    else
    {
        res.send(data.toJSON());
    }
   });
})

也试试console.log(data)。如果是数组,请将res.send(data)替换为res.send(data.map(v =&gt; v.toJSON())

【讨论】:

  • console.log(data) return [] 查看我的新截图
【解决方案2】:

看来data 属性是对象的父级。在ngOnInit()中尝试以下操作

ngOnInit() {
  this.myservice.GetList().subscribe(
    res => { 
      this.dataSource.data = res['data'];
    },
    error => { 
      // always good practice to handle error in HTTP observables
    }
  );
}

【讨论】:

  • 它回复“ERROR TypeError: Cannot read property 'length' of undefined”
  • 能否请您发布访问length 属性的代码?
  • 请重新检查代码。错误消息是无法读取属性'length'
  • length 属性来自 Array 的标准内置对象。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 在用户应用中用于访问数组的长度。从屏幕截图中可以看出该数组是空的。您需要验证如何从后端访问数据以及后端是否发送了正确的数据。并阅读 Angular Tour of Heroes 教程。它介绍了 Angular 的一些基础知识。
【解决方案3】:

ngOnInit()里面替换

return this.myservice.GetList().subscribe(res => this.dataSource.data = res["0"]["data"]);

this.myservice.GetList().subscribe(res => {
        console.log(res); // Check your 'res' data first
        dataSource.data = res["0"]["data"];
    });

注意:控制台您的 res 以了解您的响应数据如何。

【讨论】:

  • console.log(res); return [] 请看我的新截图
  • 在您的服务中,将“return this._http.get('localhost:3000/api/getList')”替换为“return this._http.get('localhost:3000/api/getList').map(res => res.json());”并再次安慰。请以文字形式分享结果,而不是分享屏幕截图。
  • 对不起,我第一次在这里问。错误将发生在 .map 类型“Observable”上不存在属性“map”。
  • 导入'rxjs/Rx';在服务中
  • 从 'rxjs' 导入 { Observable };仍然会出现同样的错误
猜你喜欢
  • 2018-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 2021-11-22
  • 2018-07-12
  • 2021-12-16
  • 2020-08-16
相关资源
最近更新 更多