我正在开发一个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。
下面是请求的样子:
{
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。根据这个链接,我写了以下内容:
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是什么。我得到的错误可能就是由它引起的。
发布于 2019-04-24 04:50:24
我设法通过邮递员发送了我的请求,从而获得了真正的错误:
{
"error": {
"errors": [
{
"domain": "global",
"reason": "insufficientPermissions",
"message": "Insufficient Permission"
}
],
"code": 403,
"message": "Insufficient Permission"
}
}
不确定为什么我没有足够的权限。我在Authorization头中发送了一个有效的、尚未过期的oauth2令牌。我猜是作用域。
发布于 2019-04-24 06:53:25
您看到的错误是因为在使用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
https://stackoverflow.com/questions/55802198
复制相似问题