Почему datasource.server печатает undefined в http get subscribe, даже если возвращаемые data.length> 0

#angular #typescript

#угловатый #машинописный текст

Вопрос:

У меня есть веб-api, который возвращает список источников данных для данного идентификатора пользователя. Приложение angular использует этот веб-api для получения списка источников данных. Внутри метода subscribe console.log(data.length) печатается как 2 (как и ожидалось), но console.log(data[0].server); печатается как неопределенный. Я не мог понять, почему? Любая помощь была бы очень признательна. вывод postman веб-api

 [
    {
        "USERID": "user1",
        "SERVER": "localhost",
        "AUTHENTICATION": "WINDOWS",
        "DATABASE": "db1"
    },
    {
        "USERID": "user1",
        "SERVER": "localhost",
        "AUTHENTICATION": "SQL",
        "DATABASE": "db2"
    }
]
 

Класс источника данных в angular определяется следующим образом:

 export class Datasource {
userid: string;
server: string;
authentication: string;
database: string;
}
 

Обслуживание

 getDatasource():Observable<Datasource[]>{
    let userid = this._authService.name;
    let params = new HttpParams()
    params = params.set('USERID', userid);
     return this._httpClient.get<Datasource[]>(`https://localhost:8080/api/DataSources/ByUserId`, {params: params})
      .pipe(
        catchError(this.handleError)
      );
}
 

Компонент:

 import { Component, OnInit } from '@angular/core';
import { Datasource } from 'src/app/model/datasource';
import { DbService } from 'src/app/services/db.service';


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

export class DatasourcesComponent implements OnInit {
  constructor(private _dbService: DbService) {
   }

  ngOnInit(): void {
    
    this._dbService.getDatasource()
      .subscribe(data => {
        console.log('data length: '   data.length); //prints as 2 as expected(I have 2 records in db, so thats correct)
        //console.log(typeof(data[0])); //prints as object
        //the following output in debug window is 'undefined'?
        console.log('server[0]: '   data[0].server);
        console.log('server[1]: '   data[1].server);
      });
  }
}
 

консоль.выходное изображение журнала

Комментарии:

1. Сделайте а console.log(data) и посмотрите, что именно в нем содержится.

2. Он печатает в виде данных: [объект Object],[объект Object].

3. Пожалуйста, опубликуйте скриншот результата.

4. согласно вашему результату api, доступ к данным должен осуществляться с помощью: data[0]. СЕРВЕР. JSON чувствителен к регистру

Ответ №1:

Может произойти одно из двух:

  1. Параметр getDatasource -Observable может возвращать значение, которое не соответствует Datasource объекту, который вы предоставляете (канал может изменить его).
  2. Серверная getDatasource часть, с которой взаимодействует -Observable (для получения данных), может возвращать данные, которых вы не ожидаете.

Вот пара предложений:

  1. Как предлагает @MichaelD, console.log(data) или, что еще лучше, используйте свой браузер, чтобы установить точку останова в начале функции подписки и проверить, что «возвращается».
  2. Откройте средство проверки сети вашего браузера и убедитесь, что вы получаете обратно то, что ожидаете (от сервера). Если вы используете Chrome, в меню нажмите: View > Developer > Developer Tools выберите вкладку Network — и выберите ответ, который «возвращается с сервера».

Комментарии:

1. Спасибо Майклу и @Anders. Отладка показала 2 вещи 1. Он вернул столбец таблицы, который отличается от определения таблицы определения класса Angular в базе данных ( S_USERID varchar(64), S_SERVER varchar(64), S_AUTHENTICATION varchar(64), S_DATABASE varchar(64) ) 2. Во-вторых, служба возвращает следующий формат с именами полей, такими как: s_USERID: «user1» s_SERVER: «localhost» s_AUTHENTICATION: «WINDOWS» s_DATABASE: «db1» Вместо первой буквы поля в нижнем регистре, есть ли способ получить выходные данные, по крайней мере, такие же, как имена столбцов базы данных?