首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >TypeError:您提供了“undefined”,其中一个流

TypeError:您提供了“undefined”,其中一个流
EN

Stack Overflow用户
提问于 2019-04-23 07:08:36
回答 2查看 593关注 0票数 0

我正在开发一个Angular 6应用程序,它试图连接到Google API并检索电子邮件消息。

我使用这个链接作为指导:

https://developers.google.com/gmail/api/v1/reference/users/messages/get#examples

根据该站点,获取消息的端点是:

https://www.googleapis.com/gmail/v1/users/userId/messages/id

我不确定我的用户ID是什么,也不确定邮件ID是什么。因此,我尝试将我的电子邮件地址作为用户ID,并将1作为消息ID (认为这只是一个递增的数字)。

但是,当我发送请求时,我收到以下错误:

TypeError:您在需要流的位置提供了“undefined”。您可以提供Observable、Promise、Array或Iterable。

请注意,我没有使用gapi客户端库或任何其他库。我只是通过HttpClient.request(req: HttpRequest)发送请求。这是因为我们希望能够向多个API提供商发送请求,而不仅仅是Google。

下面是请求的样子:

代码语言:javascript
复制
{
  body: null,
  headers: {
    headers: Map(0) {},
    lazyInit: {...},
    lazyUpdate: {
      0: {name: "Authorization", value: "Bearer ya29.Glv0B...},
      length: 1
    },
    normalizedNames: Map(0) {}
  },
  method: "GET",
  params: {...},
  reportProgress: false,
  responseType: "json",
  url: “https://www.googleapis.com/gmail/v1/users/***@gmail.com/messages/1”,
  urlWithParams: “https://www.googleapis.com/gmail/v1/users/***@gmail.com/messages/1”,
  withCredentials: false
}

请注意,我已经展开了标头,以显示我有一个持有者令牌,当我发送请求时,该令牌尚未过期。

所以我的问题有两个:

1)错误消息是什么意思:您在需要流的位置提供了'undefined‘。

2)如何计算出我的用户ID和消息ID?

编辑:我在这里遇到了一个类似的帖子:TypeError: You provided 'undefined' where a stream was expected。然而,这篇文章中提供的解决方案并没有解决我的问题。斯蒂芬提供了一个关于如何获取真正的错误消息的链接(因为“您提供了'undefined‘where a stream...”其中一个显然是不正确的)在这个网站:https://angular.io/guide/http#getting-error-details。根据这个链接,我写了以下内容:

代码语言:javascript
复制
async callEndpoint(endpoint: Endpoint): Promise<any> {
  const request = await this.getRequest(endpoint);
  return await this._http.request(request).pipe(
    catchError(this.handleError)
  );
}

handleError(error: HttpErrorResponse): ObservableInput<{}> {
  console.log('error in handleError:', error);
  return null;
}

但它甚至没有到达handleError。相反,它会给出一个不同的错误:

JSON :将循环结构转换为

^我不知道那是什么意思。

链接没有回答我的问题的第二个原因是因为我的问题有两个:除了问我为什么会收到这个错误之外,我还问我如何才能弄清楚我的gmail用户ID是什么,消息ID是什么。我得到的错误可能就是由它引起的。

EN

回答 2

Stack Overflow用户

发布于 2019-04-24 04:50:24

我设法通过邮递员发送了我的请求,从而获得了真正的错误:

代码语言:javascript
复制
{
  "error": {
    "errors": [
        {
            "domain": "global",
            "reason": "insufficientPermissions",
            "message": "Insufficient Permission"
        }
    ],
    "code": 403,
    "message": "Insufficient Permission"
  }
}

不确定为什么我没有足够的权限。我在Authorization头中发送了一个有效的、尚未过期的oauth2令牌。我猜是作用域。

票数 0
EN

Stack Overflow用户

发布于 2019-04-24 06:53:25

您看到的错误是因为在使用rxjs catchError运算符时没有返回可观察值。您可能应该使用throwError,请参阅:https://rxjs.dev/api/index/function/throwError

以下是如何根据您的代码使用throwError的示例:

代码语言:javascript
复制
handleError(error: HttpErrorResponse): Observable<any> {
  console.log('error in handleError:', error);
  return throwError(error);
}

至于为什么会出现HTTP错误,看起来您需要提供某种授权,它应该在这里告诉您如何做到这一点:https://developers.google.com/gmail/api/auth/about-auth

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55802198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档