【问题标题】:GET request works on backend with Postman, but returns null to frontendGET 请求在 Postman 的后端工作,但返回 null 到前端
【发布时间】:2020-02-23 04:53:22
【问题描述】:

我有一个 GET 请求,如果我将创建者作为 api/watchlist/?creator=5dac9d3567aca81e40bfc0 之类的参数添加到帖子中,并在 Postman 中对其进行测试,结果会正确返回该创建者的所有帖子以及以下代码。

app.js

  app.get('/api/watchlist',(req, res, next)=>{
  Watching.find({ creator: req.query.creator})
  .then(documents => {
    console.log("Creator value: " + req.query.creator);
   res.status(200).json({
     message: 'User\'s watchlist items retrieved!',
     posts: documents

  });

   });
   });

如果我尝试将 GET 请求拉入角度,则它不会返回任何内容。 当我打开相关网页时,前端也说前端在说ERROR TypeError: "retrievedData.posts is undefined" getWatchListItems watch-list.service.ts:72

watch-list.service.ts

getWatchListItems(创建者:字符串) {

this.http
  .get<{ message: string; posts: any; maxPosts: number; watchlist: string }>(
    "http://localhost:3000/api/watchlist?creator=" + creator
  )
  .pipe(
    map(retrievedData  => {
      console.log(retrievedData.watchlist);
               return {
        posts: retrievedData.posts.map(post => {
      console.log(retrievedData.watchlist);
          return {
        title: post.title,
        cost: post.cost,
        listingOwner: post.listingOwner,
        id: post._id
          };

        }),
        maxPosts: retrievedData .maxPosts
      };
    })
  )
  .subscribe(transformedPostData => {
    console.log(transformedPostData);
    this.posts = transformedPostData.posts;
    this.postsUpdated.next({
      listing: [...this.posts],
      postCount: transformedPostData.maxPosts
    });
  });

}

watching.component.ts

 ngOnInit() {
    this.userId = localStorage.getItem("userId: ");
    //  this.userId = this.authService.getUserId();
    this.watchListService.getWatchListItems(this.userId);
    this.postsSub = this.watchListService
      .getPostUpdateListener()
      .subscribe((postData: { listing: Watching[]; postCount: number }) => {

        this.totalPosts = postData.postCount;
        this.posts = postData.listing;

      });

  }

【问题讨论】:

  • 就在你的行之后:map(retrievedData =&gt; { 添加,tap(console.log),然后显示你得到了什么
  • 我添加了水龙头工作,但它不输出。唯一输出的是“前端说 ERROR TypeError: "retrivedData.posts is undefined" getWatchListItems watch-list.service.ts:72
  • 从您的 api 响应中,它看起来像这样一行:posts: retrievedData.posts.map 应该变成 posts: retrievedData.watchlist.map。您的 api 不返回 posts

标签: node.js angular express mongoose


【解决方案1】:

您将创建作为 Angular 服务中的路由参数发送。

所以你需要像这样修改你的api:

app.get('/api/watchlist/:creater', (req, res, next) => {
  Watching.find({ creator: req.params.creator })
    .then(documents => {
      console.log("Creator value: ", req.params.creator);
      res.status(200).json({
        message: 'User\'s watchlist items retrieved!',
        watchlist: documents
      });
    });
});

如果您不想更改 api,则应将创建者作为查询参数发送,如下所示:

return this.http
      .get<{ message: string; posts: any; maxPosts: number }>(
        "http://localhost:3000/api/watchlist?creator=" + creator
      )

在此之后,您必须以角度处理响应数据,并根据您的需要进行转换。

您能否通过在此代码中包含此 console.log 结果来更新问题? (据我所知,在您不需要订阅的服务中,您正在订阅您的组件)

getWatchListItems(creator: string) {

  return this.http("http://localhost:3000/api/watchlist?creator=" + creator)
    .pipe(
      map(retrievedData => {
        console.log("retrievedData: ", retrievedData);
        //todo: transform retrievedData

        return retrievedData;
      })
    )
}

别忘了你的api是以这种格式返回数据的,所以你应该

{
  "watchlist": ...
   "message": ...
}

【讨论】:

  • 我更新了我的代码以反映您的答案,但它仍然在前端控制台上返回“retrivedData.posts is undefined”,所以它仍然没有返回任何内容。
  • @user6680 console.log(transformedPostData);输出?你能补充你的问题吗?你也可以在这里添加一个console.log:.pipe(map(retrievedData => {console.log(“data:”,retrieveData); ...
  • console.log("data: ", retrievedData) 返回数据[object Object]
  • @user6680 那么console.log(retrivedData.watchlist)呢?在我的答案中
  • 我更新了顶部的代码以显示最新的。如果您检查,我在顶部代码的两个位置添加了 console.log(retrivedData.watchlist)。但我从来没有看到它出现在控制台中。
猜你喜欢
  • 2020-08-02
  • 2021-07-14
  • 2021-07-14
  • 2021-01-19
  • 2016-06-03
  • 1970-01-01
  • 2016-07-03
  • 2022-01-12
  • 1970-01-01
相关资源
最近更新 更多