Не удается найти файл определения типа для «запроса»: ОШИБКА в node_modules/@looker/sdk-rtl/lib/oauthSession.d.ts:1:23 — ошибка TS2688

#angular #typescript #looker

#угловой #машинописный текст #смотрящий

Вопрос:

Я пытаюсь интегрировать Looker Embedded Client SDK с angular, поэтому установил @looker / SDK и настроил настройки в соответствии с рекомендациями, приведенными на официальной странице npm для @looker / sdk для доступа к API.

Но когда я попытался получить доступ к нескольким методам и классам, приложение Angular начало сбоить. Внешний вид
Ошибка:

 ERROR in node_modules/@looker/sdk-rtl/lib/oauthSession.d.ts:1:23 - error TS2688: Cannot find type definition file for 'request'.

1 /// <reference types="request" />

 

И конфигурация:

 // package.json 

{ 
   //package.json
   
 "dependencies": {
    "@angular/core": "~10.2.3",
    "@looker/sdk": "^7.20.3",
    // few other libs
  },
  "devDependencies": {
   // few other libs  
  "@angular/cli": "~10.2.0",
     "typescript": "~4.0.5"
  },
 
//tsconfig.json
"compilerOptions": {
  // few other settings
  "module": "es2020",
  "target": "es5",
   "lib": [
    "es2020",
    "dom"
  ],
 

/ /And in component file:

import { LookerNodeSDK } from '@looker/sdk/lib/node'

@Component({
  selector: 'rs-reports',
  templateUrl: './reports.component.html',
  providers: [ReportsService]
})
export class ReportsComponent implements OnInit {

  constructor() {
  }
  ngOnInit() {
    this.getLookerConfig()
      .then(response => {
        console.log(response, 'Success')
      }).catch(error => {
      console.log(error, 'Error')
    });
  }

  async getLookerConfig() {
    // create a Node SDK object for API 3.1
    const sdk = LookerNodeSDK.init31();
    // retrieve your user account to verify correct credentials
    const me = await sdk.ok(sdk.me(
      "id, first_name, last_name, display_name, email, personal_space_id, home_space_id, group_ids, role_ids"))
    console.log({me})
    // make any other calls to the Looker SDK
    const dashboards = await sdk.ok(
      sdk.search_dashboards({title: 'My SDK dashboard'})
    )
    if (dashboards.length === 0) {
      console.log('Dashboard not found')
    }


    await sdk.authSession.logout()
    if (!sdk.authSession.isAuthenticated()) {
      console.log('Logout successful')
    }
  }


 

Ответ №1:

Я не очень хорошо разбираюсь в Angular, но я думаю, что эта ошибка — отвлекающий маневр. Вы пытаетесь использовать узловую версию Looker SDK ( LookerNodeSDK ) в приложении angular, что, вероятно, будет работать не слишком хорошо. NodeSDK предназначен для использования в Node.js бэкенды, и мы отправляем LookerBrowserSDK их для использования во внешних приложениях.

К сожалению, это не очень хорошо документировано (я собираюсь попытаться улучшить это), но я уверен, что вы добьетесь большего успеха, если попробуете browserSDK.

import { Looker31SDK, LookerBrowserSDK } from '@looker/sdk/lib/browser'

Как я уже сказал, я действительно не знаю Angular, но вот некоторый Javascript, который должен работать лучше, если вы поместите его в ngOnInit . browserSDK и nodeSDK реализуют одни и те же методы, поэтому все должно работать так, как задокументировано. Единственное важное отличие, которое следует отметить, заключается в том, что инициализация SDK отличается, вы не можете передать файл settings.ini или что-либо еще. Вы можете создать пользовательское средство чтения конфигурации и передать его ему, если вы не хотите использовать Oauth. Проверьте это:

 import { Looker31SDK, LookerBrowserSDK } from '@looker/sdk/lib/browser'
import { ApiSettings, IApiSettings, IApiSection } from '@looker/sdk-rtl'

/**
 * @class CustomConfigReader
 *
 * A custom configuration reader that overrides the readConfig() method
 * in NodeSettings to allow fetching client_id and client_secret
 * from anywhere.
 */
class CustomConfigReader extends ApiSettings {
  constructor(settings: IApiSettings) {
    super(settings)
  }

  /**
   * @returns an IApiSection object containing client_id and client_secret
   */
  readConfig(): IApiSection {
    return {
      client_id: 'clientId',
      client_secret: 'clientSecret',
    }
  }
}

;(async () => {
  const sdk = LookerBrowserSDK.init31(
    new CustomConfigReader({
      base_url: 'https://<your-looker-server>:19999 or https://your.cloud.looker.com',
    } as IApiSettings)
  )

  const me = await sdk.ok(
    sdk.me(
      'id, first_name, last_name, display_name, email, personal_space_id, home_space_id, group_ids, role_ids'
    )
  )
  console.log({ me })
})()

 

а затем реализуйте свою функцию. browserSDK и nodeSDK реализуют одни и те же методы, поэтому все должно работать так, как задокументировано.

Комментарии:

1. Я попробовал способ, о котором вы упомянули, и он работает с простым машинописным текстом и узлом, но я интегрировал это с angular и пытается запустить ng serve , а затем снова мы получаем ту же ошибку. ` ОШИБКА в node_modules/@looker/sdk-rtl/lib/oauthSession.d.ts:1:23 — ошибка TS2688: не удается найти файл определения типа для «запроса». 1 /// <ссылочные типы=»запрос» />`

2. Ах, хм. Хорошо, позвольте мне установить Angular и запустить его.

3. Ну, теперь я вижу ту же ошибку, так что это хорошо! Работаю над этим…

4. Ах, хорошо, это выглядит как просто проблема с отсутствующим типом в SDK. Если вы добавите "@types/request": "2.48.5", в свой package.json в разделе devDependencies, это должно исправить. Я посмотрю, как это исправить в самом SDK…

5. Ну, добавление "@types/request": "2.48.5" не помогает