尝试使用 Power BI Angular 库嵌入报表时出现以下错误。
TypeError: Cannot read properties of undefined (reading 'tokenType')
at isSaaSEmbedWithAADToken (reportEmbed?navContentPaneEnabled=false&uid=ame7c8:586:38)
at getModelsAndExploration (reportEmbed?navContentPaneEnabled=false&uid=ame7c8:696:17)
at getModelsAndExplorationAndConceptualSchema (reportEmbed?navContentPaneEnabled=false&uid=ame7c8:840:9)
at xhr.onreadystatechange (reportEmbed?navContentPaneEnabled=false&uid=ame7c8:505:37)
这是我们用来嵌入报告的代码。
this.msalService.initialize().subscribe(() => {
this.msalService.acquireTokenSilent({
scopes: environment.powerBiConfig.scopes,
account: this.authService.getUser()
}).subscribe(async (result) => {
const embedConfig: pbi.service.IComponentEmbedConfiguration = {
type: 'report',
id: this.report.identifier,
accessToken: result.accessToken,
tokenType: models.TokenType.Aad,
embedUrl: 'https://app.powerbi.com/reportEmbed?navContentPaneEnabled=false',
settings: {
panes: {
filters: {
visible: false,
}
}
}
};
const defaultFilters = this.createDefaultFilters();
const powerBiReport: any = this.powerBiService.embed(this.reportContainer.nativeElement, embedConfig);
powerBiReport.on('loaded', async () => {
await powerBiReport.setFilters(defaultFilters);
});
});
});
跟踪 Power BI Embedded JS 文件(我们无法控制)的堆栈跟踪后,我们能够确定导致问题的原因。 以下函数需要传递配置:
function isSaaSEmbedWithAADToken(config) {
// Default token type is Aad (0)
const tokenType = config.tokenType || 0;
return (window.isSaasOrPaasEmbed === true) && (tokenType === 0);
}
然而,导致错误的代码段实际上并未传递配置。
if (isSaaSEmbedWithAADToken() && config.settings && config.settings.personalBookmarksEnabled) {
url += "&defaultBookmarkEnabled=true";
}
即使我们这边做错了什么,这也是微软这边的一个错误。修复方法只是像代码的其他部分已经执行的那样传递配置。
我们的设置是否有问题导致此问题? Power BI Embedded JS 文件似乎是闭源的。
问题已在 Microsoft 端得到修复。 https://github.com/microsoft/powerbi-client-angular/issues/66