开发者问题收集

使用 powerbi-client-act 和 typescript 项目时出现“服务器错误 ReferenceError: self 未定义”

2023-01-31
926

我尝试在用 typescript 编写的项目中使用该 lib powerbi-client-react,但在尝试运行它时出现以下错误:

我的组件代码:

import { PowerBIEmbed } from 'powerbi-client-react';
import { models } from 'powerbi-client';

// aditional declarete from use "window" in my getEmbeddedComponent
declare global {
    interface Window { report: any; }
}

export default function PbiEmbeddedDashboard() {

    return (
        <div className="App">

            <PowerBIEmbed
                embedConfig={{
                    type: 'report',   // Supported types: report, dashboard, tile, visual and qna
                    id: '<Report Id>', // the information has been filled in correctly in the project
                    embedUrl: '<Embed Url>', // the information has been filled in correctly in the project
                    accessToken: '<Access Token>', // the information has been filled in correctly in the project
                    tokenType: models.TokenType.Embed, // i also tried to use the models.TokenType.Aad but the error was the same
                    settings: {
                        panes: {
                            filters: {
                                expanded: false,
                                visible: false
                            }
                        },
                        background: models.BackgroundType.Transparent,
                    }
                }}

                eventHandlers={
                    new Map([
                        ['loaded', function () { console.log('Report loaded'); }],
                        ['rendered', function () { console.log('Report rendered'); }],
                        ['error', function (event) { console.log(event.detail); }]
                    ])
                }

                cssClassName={"report-style-class"}

                getEmbeddedComponent={(embeddedReport) => {
                    window.report = embeddedReport;
                }}
            />

        </div>
    )
};

这是返回错误:

Server Error
ReferenceError: self is not defined

This error happened while generating the page. Any console logs will be displayed in the terminal window.
Call Stack
Object.<anonymous>
file:///home/myProject/sistema-web-myProject/be-front/node_modules/powerbi-client-react/dist/powerbi-client-react.js (1:452)
Module._compile
internal/modules/cjs/loader.js (1085:14)
Object.Module._extensions..js
internal/modules/cjs/loader.js (1114:10)
module.load
internal/modules/cjs/loader.js (950:32)
Function.Module._load
internal/modules/cjs/loader.js (790:12)
module.require
internal/modules/cjs/loader.js (974:19)
require
internal/modules/cjs/helpers.js (101:18)
Object.powerbi-client-react
file:///home/myProject/sistema-web-myProject/be-front/.next/server/pages/dashboards/pbi.js (52:18)
__webpack_require__
file:///home/myProject/sistema-web-myProject/be-front/.next/server/webpack-runtime.js (33:42)
eval
webpack-internal:///./src/util/pbiEmbedded/pbi_getAccessToken.tsx (9:78)

对我来说,这听起来很奇怪,因为我在另一个用 javascript 编写的项目中使用了几乎相同的代码,但一切似乎都运行正常。

您能帮助我解决这个问题并了解发生了什么吗?

我也尝试使用 models.TokenType.Aad,但错误是一样的

我没有找到与此相关的任何内容

2个回答

由于缺少窗口对象(服务器端渲染中不可用),您遇到了错误。

我们有以下 2 个选项可以解决此问题:

选项 1:在代码中使用窗口对象之前检查窗口对象是否存在。但是,这种方法可能需要跳过依赖于窗口对象的代码,这可能不适合我们的用例。

选项 2:使用动态导入或延迟加载仅在客户端加载使用窗口对象的代码。这种方法可确保代码仅在窗口对象可用的浏览器中执行,而无需跳过任何代码。

您可以尝试以下代码来使用动态导入:

import dynamic from 'next/dynamic'

import { EmbedProps } from 'powerbi-client-react';

import { models } from "powerbi-client";

const PowerBIEmbed = dynamic<EmbedProps>(() => 
import('powerbi-client-react').then(m => m.PowerBIEmbed), { ssr: false });

如果您需要任何进一步的帮助或说明,请告诉我。

Madhav
2023-08-03

除了 Madhav 的 解决方案 之外,我相信您可能还会使用另一个库以及 PowerBIEmbed。

import { models } from "powerbi-client";

这也需要动态导入。这是我在 useEffect 中实现它的方法。

 useEffect(() => {
    const loadModule = async () => {
      const { models } = await import("powerbi-client");
    };
    loadModule();
  }, []);

附注:对我来说,动态导入要求输入模型类型,因此我使用了 useEffect 方法。如果我们可以以某种方式动态导入,请告诉我。

Mahi
2024-02-14