TypeError: Вы указали «undefined», где поток - PullRequest
0 голосов
/ 23 апреля 2019

Я разрабатываю приложение Angular 6, которое пытается подключиться к API Google и получать сообщения электронной почты.

Я использую эту ссылку в качестве руководства:

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

Согласно этому сайту конечная точка для получения сообщений:

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

Я не уверен, чтомой идентификатор пользователя или идентификаторы почтовых сообщений.Поэтому я только что попробовал свой адрес электронной почты для идентификатора пользователя и 1 для идентификатора сообщения (думая, что это будут просто инкрементные числа).

Однако, когда я отправляю запрос, я получаю эту ошибку:

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) Как мне узнать мой идентификатор пользователя и идентификатор сообщения?

РЕДАКТИРОВАТЬ: Я сталкивался с подобным постом здесь: TypeError: Выпредоставил «неопределенный», где ожидался поток .Однако решения, предложенные в этом посте, не решили мою проблему.Стефан предоставляет ссылку о том, как получить реальное сообщение об ошибке (потому что «Вы указали« неопределенный », где поток ...», по-видимому, неверно) на этом сайте здесь: 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;
}

Но он даже не справляется с ошибкой.Вместо этого он дает другую ошибку:

TypeError: Преобразование круговой структуры в JSON

^ Я понятия не имею, что это значит.

Вторая причинассылка не отвечает на мой вопрос, потому что мой вопрос двоякий: помимо вопроса, почему я получаю ошибку, я также спрашиваю, как я могу узнать, каков мой идентификатор пользователя Gmail и чтоИдентификатор сообщенияОшибка, которую я получаю , может быть просто вызвана этим.

Ответы [ 2 ]

0 голосов
/ 24 апреля 2019

Ошибка, которую вы видите, заключается в том, что вы не возвращаете наблюдаемое при использовании оператора 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

0 голосов
/ 23 апреля 2019

Мне удалось получить настоящую ошибку, отправив запрос через почтальона:

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

Не уверен, почему у меня недостаточно разрешений. У меня есть действительный токен oauth2, срок действия которого еще не истек, и который я отправляю в заголовке авторизации. Я думаю, это рамки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...