#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"
не помогает