datart icon indicating copy to clipboard operation
datart copied to clipboard

故事板分享后进行轮播时,部分页面数据加载不了

Open servlet001 opened this issue 2 years ago • 2 comments

Datart版本号 1.0.0-rc.1

错误描述 故事板在分享后,访问分享连接页后,轮播一段时间某个页面就获取不到数据了

如何重现 重现错误的步骤,例如:

  1. 配置两个仪表板,里面各有两个图表,并开启自动刷新数据(60s)
  2. 将两个仪表添加到一个故事板(1分钟轮播频率),并分享
  3. 访问分享连接,等一段时候后,有一个仪表板中的图表没有数据
  4. 通过查看网络请求,发下有一个图表请求后台execute接口时,没有带上executeToken

期望结果 在轮播过程中,图表数据正常展示

截图 image 可以看到有一个execute请求没有token, 我仔细看了下,总共有三个viz接口请求,第一个是通过故事板id获取故事板下面的两个仪表板 第二个viz和第三个viz分别是两个仪表板的请求,返回各自的executeToken 当第三个viz调用后,第二个viz请求返回的executeToken好像被覆盖了,导致它下面的图表请求没有token,加载不到数据

运行环境详情:(可选,取决于错误发生的具体位置)

  • OS: CentOS Linux release 7.7.1908
  • 数据源: Doris
  • 浏览器: Microsoft Edge 版本 111.0.1661.43 (正式版本) (64 位)

其他内容 有关这个问题的任意其他内容

servlet001 avatar Jun 08 '23 06:06 servlet001

这个问题还没有解决吗 刚用到这个东西

自己尝试了这个方案,目前已解决。

1.在src/app/pages/SharePage/StoryPlayer/StoryPlayerForShare/StoryPlayerForShare.tsx文件中调用的getPageContentDetail方法中加一个参数needRefreshExecuteToken。

2.在src/app/pages/StoryBoardPage/slice/thunks.ts文件中调用的getBoardDetail方法中加一个参数needRefreshExecuteToken。

3.在src/app/pages/DashBoardPage/pages/Board/slice/thunk.ts文件中增加方法fetchBoardExecuteTokenInShare。

export const fetchBoardExecuteTokenInShare = createAsyncThunk<
  null,
  {
    dashboardRelId: string;
    vizToken: ExecuteToken;
    filterSearchParams?: FilterSearchParams;
    shareToken?: string;
  }
>(
  'board/fetchBoardExecuteTokenInShare',
  async (params, { dispatch, rejectWithValue }) => {
    const { vizToken, shareToken } = params;
    const { data } = await request2<ShareVizInfo>({
      url: `shares/${shareToken}/viz`,
      method: 'POST',
      data: {
        authorizedToken: vizToken.authorizedToken,
      },
    });
    console.log('fetchBoardExecuteTokenInShare', data.executeToken);
    dispatch(
      shareActions.setExecuteTokenMap({
        executeToken: data.executeToken,
        shareToken: data.shareToken,
      }),
    );
    return null;
  },
);

4.在src/app/pages/DashBoardPage/pages/Board/slice/thunk.ts文件中getBoardDetail方法内部 if (dashboard) 处取用缓存逻辑中重新获取ExecuteToken解决问题。

export const getBoardDetail = createAsyncThunk<
  null,
  {
    dashboardRelId: string;
    filterSearchParams?: FilterSearchParams;
    vizToken?: ExecuteToken;
    shareToken?: string;
    needRefreshExecuteToken?: boolean;
  }
>(
  'board/getBoardDetail',
  async (params, { getState, dispatch, rejectWithValue }) => {
    // 1 在 内存里找到就返回
    const dashboard = selectBoardById(
      getState() as { board: BoardState },
      params?.dashboardRelId,
    );
    if (dashboard) {
      // console.log('needRefreshExecuteToken', params.needRefreshExecuteToken);
      if (params.needRefreshExecuteToken && params.vizToken) {
        await dispatch(
          fetchBoardExecuteTokenInShare({ ...params, vizToken: params.vizToken }),
        );
      }
      return null;
    }
    if (params.vizToken) {
      await dispatch(
        fetchBoardDetailInShare({ ...params, vizToken: params.vizToken }),
      );
    } else {
      await dispatch(fetchBoardDetail(params));
    }
    return null;
  },
);

xinlei3166 avatar Apr 28 '25 10:04 xinlei3166

您发的邮件,我已收到。

hangpengyue avatar Apr 28 '25 10:04 hangpengyue