TypeError:您在流中提供了“未定义”

时间:2019-04-22 23:08:36

标签: angular google-api gmail-api

我正在开发一个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:您提供了“未定义”的预期流。您可以提供一个Observable,Promise,Array或Iterable。

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

请求内容如下:

{
  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。但是,该帖子中提供的解决方案无法解决我的问题。 Stephane在以下站点上提供了有关如何获取真实错误消息的链接(因为“您在流中提供了'undefined',显然是不正确的……”)此处的网址为https://angular.io/guide/http#getting-error-details。在该链接之后,我这样写:

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。相反,它给出了另一个错误:

  

TypeError:将圆形结构转换为JSON

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

链接无法回答我的问题的第二个原因是因为我的问题是双重的:除了问为什么我遇到错误外,我还问我如何弄清楚我的gmail用户ID是什么,消息ID是什么。我得到的错误可能是 造成的。

2 个答案:

答案 0 :(得分:0)

我设法通过邮递员发送请求来得到真正的错误:

{
  "error": {
    "errors": [
        {
            "domain": "global",
            "reason": "insufficientPermissions",
            "message": "Insufficient Permission"
        }
    ],
    "code": 403,
    "message": "Insufficient Permission"
  }
}

不确定为什么我没有足够的权限。我在授权标头中发送了一个有效的尚未过期的oauth2令牌。我的猜测是范围。

答案 1 :(得分:0)

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

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

handleError(error: HttpErrorResponse): Observable<any> {
  console.log('error in handleError:', error);
  return throwError(error);
}

关于为什么收到HTTP错误,看来您需要提供某种授权,它应该在这里告诉您如何执行此操作:https://developers.google.com/gmail/api/auth/about-auth