我正在开发一个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是什么。我得到的错误可能是 造成的。
答案 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