【问题标题】:Angular 5+ http post issueAngular 5+ http 发布问题
【发布时间】:2018-10-02 09:26:38
【问题描述】:

我能够从我的本地主机上的 JSON 文件中很好地检索我的对象。但是,在发布后,我得到了。

Cannot read property 'id' of undefined

在我传入的模拟对象上,如果我添加一个 id 属性和一些随机数,它就可以工作。但我不想传入 id。

这里是服务:

@Injectable()
export class TileService {

  tiles$ = new Subject<any>();
  details$  = new Subject<any>();
  messages$  = new Subject<any>();

  private tilesUrl = 'http://localhost:3000/tiles';

  private httpOptions = {
    headers: new HttpHeaders({ 'Content-Type': 'application/json' })
  };

  constructor(private http: HttpClient) { }

  getTiles(): Observable<Tile[]> {
    return this.http.get<Tile[]>(this.tilesUrl);
  }

   createTile(t: Tile) {
    return this.http.post<Tile>(this.tilesUrl, t, this.httpOptions).subscribe(
      res => {
        console.log(res);
      },
      (err: HttpErrorResponse) => {
        console.log(err.error);
        console.log(err.name);
        console.log(err.message);
        console.log(err.status);
      }
    );
   }

}

这里是我传入模拟对象的地方:

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

export class AvailableTilesComponent implements OnInit {

  title = 'Available Tiles';

  tiles: Tile[];


  mockNewTile = {
    title: 'GO',
    description: 'Go is an open source programming language that makes it easy to build simple, reliable, and efficient software.',
    code: {
        snippetA: 'something here.',
        }
  };

  constructor(private tileService: TileService) { }

  ngOnInit() {
    this.tileService.getTiles().subscribe(x => this.tiles = x);
  }

  addTile(t: Tile) {
    this.tileService.tileStream(t);
    this.tileService.messageStream( t.title +  ' tile added.');
  }

  createTile() {
    this.tileService.createTile(this.mockNewTile);
  }
}

我正在使用 json-server 来允许在我的本地主机上进行 REST 操作。

http://localhost:3000/tiles.json的内容

{
  "tiles": [
    {
      "title": Language A",
      "description": "Language A description.",
      "code": {
        "snippetA": "lang snippet a1",
        "snippetB": "lang snippet a2",
        "snippetC": "lang snippet a3"
      }
    },
       {
      "title": Language B",
      "description": "Language B description.",
      "code": {
        "snippetA": "lang snippet b1",
        "snippetB": "lang snippet b2",
        "snippetC": "lang snippet b3"
      }
    }
  ]
}

【问题讨论】:

  • 我怀疑错误是在其他地方触发的,因为您没有访问 id 属性,至少在您的代码中是这样。
  • 我的代码中没有任何地方有一个已传递的 ID,我的 Tile 模型也不需要它。
  • @Jeremiah2911 你刚刚指出了错误……你应该提供服务器需要的东西
  • 如何在不要求用户输入 ID 的情况下做到这一点?我想是随机的修女根。为什么服务器仍然需要一个 id?除非这是获得磁贴独有属性的最佳方式。
  • 这需要知道您正在与哪个服务器通信,以及它的 API

标签: angular rest json-server


【解决方案1】:

有两种方法可以解决此问题。

  1. 如果您有权访问后端代码,则可以将其更改为忽略接受请求的 id 字段。而是自动增加 id 字段。

  2. 您可以在用户不输入 id 的情况下传递 id。


npm install uuid --save

import { v4 as uuid } from 'uuid';

 mockNewTile = {
      id : uuid(),
      title: 'GO',
      description: 'Go is an open source programming language that makes it easy to build simple, reliable, and efficient software.',
      code: {
          snippetA: 'something here.',
       }
   };

我希望这会有所帮助。如果它不起作用,请随时发表评论。我就在那儿。

【讨论】:

  • 谢谢。我喜欢你的 1) 解决方案,但不确定如何做到这一点,因为后端设置是由 Node 的 json-server 自动完成的。您的 2) 解决方案成功了。
猜你喜欢
  • 1970-01-01
  • 2018-09-10
  • 1970-01-01
  • 2012-03-16
  • 2019-07-18
  • 2015-11-11
  • 2018-10-27
  • 2017-07-09
  • 1970-01-01
相关资源
最近更新 更多