【问题标题】:Sending Object through HTTP POST in Angular在 Angular 中通过 HTTP POST 发送对象
【发布时间】:2021-06-09 10:33:19
【问题描述】:

我正在使用 Angular 创建一个 Web 应用程序。现在,我的项目已经有一个后端、一个前端和一个 API Rest。在这种情况下,我试图从我的前端页面发送一个对象到前端的服务,如下所示:

  async save_pack(index: any){
    await this.usuarioService.save_pack(this.packs[index])
      .then((data) => {
        console.log(JSON.stringify(data));
      })
      .catch(err => alert(err));
  }

然后,我使用 HTTP POST 将该对象从服务发送到 API Rest,如下所示:

   save_pack(Pack: any){
    return this.http
      .post("http://localhost:8000/save_pack",Pack)
      .toPromise()
  }

我在 API Rest 中的功能是这样的:

app.post('/save_pack', async (req,res) => {
    console.log("Elementos de la respuesta: " + req.body)
    //const Pack = req.body.Pack;

    let result = await save_pack(Pack);
    res.send(result)
    return res;
})

但是,当我尝试检查对象是否正确传递时,我意识到它没有正确传递,因为我没有显示它的值(我得到 Elementos de la respuesta: undefined)。我想我做错了,但我不知道该怎么做,因为我是 Angular 的新手。有什么想法吗?

【问题讨论】:

  • 我不认为给出的 2 个答案实际上与您的问题相关(但我同意您真的应该只使用 Observables)。当您在浏览器网络控制台中检查 POST 请求时,它是否具有您期望的 POST 负载?

标签: javascript angular frontend


【解决方案1】:

来自文档

HttpClient 服务对所有事务都使用可观察对象。您必须导入示例 sn-ps 中出现的 RxJS 可观察和操作符符号。这些 ConfigService 导入是典型的。

这个:

save_pack(Pack: any){
    return new Promise((resolve, reject) =>{
      this.http
        .post("http://localhost:8000/save_pack",Pack)
        .subscribe(res => {
            resolve(res);
          },
          (err: any) => {
            reject(err);
          }
        )
    });
  }

应该是:

save_pack(Pack: any){
    return this.http
        .post("http://localhost:8000/save_pack",Pack)
        .toPromise
    });
  }

然后你可以这样做:

this.save_pack.then((data) => {
        console.log(JSON.stringify(data));
      })
      .catch((error) => {
        console.log("Promise rejected with " + JSON.stringify(error));
      });

我从 5 个月开始就在研究 Angular,所以我不是真正的专家,但我可以告诉你一件事:学习好 observables,只有在你不能这样做时才使用 promise 和 async/await 模式,其余的带有 rxjs 和状态管理的 observables,比如 ngrx(reactive programming pattern & redux patterm) 几乎涵盖了所有用例,并且非常强大。编码不错!

【讨论】:

  • 我不明白你在做什么。如何检查对象是否正确传递?
  • 嗨耶稣,所以如果你想检查你传递的数据是否正确,你可以检查浏览器控制台。例如。在 Chrome 控制台中,如果你进入网络面板,你会找到你的 api 调用,点击它,你可以看到关于 api 调用的所有信息。但是您的save_pack 做错了,因为 Angular 的 httpclient 本身返回一个可观察对象,而您在承诺中订阅了一个可观察对象。我写给你如何在 promise 中转换一个 observable,所以你将使用 async await
  • 也许this guide可以帮助你更好地理解你的错误
  • 我已经尝试过您的解决方案,但得到的结果完全相同。检查编辑的问题。尽管如此,当我在 server.js 中执行 console.log(req.body) 只是为了检查是否通过了任何内容时,我仍然没有定义。
  • async save_pack(index: any){ await this.usuarioService.save_pack(this.packs[index])....} 这里你是在做递归异步函数吗?
【解决方案2】:

您应该使用 Observables 而不是 promises,因为整个 Angular 都很好地支持 Observables。

所以你的 HTTP POST 方法应该是这样的

save_pack(Pack: any): Observable<any> {
    return this.http.post("http://localhost:8000/save_pack",Pack);
  }

然后你应该在你的组件中订阅这个 Observable

save_pack(index: any) {
    this.usuarioService.save_pack(this.packs[index])
      .subscribe(resp => {
        console.log('resp');
      });      
  }

【讨论】:

  • 我已经使用了您的解决方案。但是,它也不起作用。只是为了检查,我在 return this.http.post 之前放了一个 console.log(Pack) ...如果我检查它,我可以看到它是完整的对象。但是,在 app.post 中,当我执行 req.body 的 console.log 时,我得到了 undefined,所以对象没有被传递。为什么?
  • 如果请求具有您期望的正文,您可以检查网络选项卡吗?如果是,那么问题不在 Angular 方面
  • 我做到了,它工作正常。当我尝试将该对象发送到 server.js 时,问题就出现了。我得到未定义为 req.body
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
  • 1970-01-01
  • 2014-03-12
  • 2019-11-23
相关资源
最近更新 更多