如何使用node JS将工作簿上传到tableau

问题描述 投票:0回答:1

这是您的问题的更详细版本,针对 Stack Overflow 进行了格式化:


使用 Tableau REST API 和 Node.js 将工作簿上传到 Tableau 时出现问题:错误 400011

我正在尝试使用 Tableau REST API 和 Node.js 将

.twbx
工作簿上传到 Tableau Server。但是,我不断遇到以下错误:

Error uploading the workbook: {
  error: {
    summary: 'Bad Request',
    detail: "There was a problem publishing the file 'Test.twbx'.",
    code: '400011'
  }
}

我尝试过的事情

我尝试了不同的方法来解决这个问题,但到目前为止都没有奏效。我遵循 Tableau REST API 文档,并确保

serverUrl
authToken
siteId
workbookName
projectId
等参数正确。我还确认了工作簿文件存在于指定的路径中。

代码示例

下面是我用来上传工作簿的代码:

import axios from 'axios';
import * as fs from 'fs/promises';

async function uploadWorkbook(
  serverUrl: string,
  authToken: string,
  siteId: string,
  workbookName: string,
  projectId: string
): Promise<void> {
  try {
    const wkBookcontent = await fs.readFile(`src/download/${workbookName}.twbx`);
    
    const boundary = generateBoundary();
    const CRLF = "\r\n"; // Carriage Return Line Feed

    // Construct the body of the request
    const body = [
      `--${boundary}`,
      'Content-Disposition: form-data; name="request_payload"',
      "Content-Type: text/xml",
      "",
      `<tsRequest>
        <workbook name="${workbookName}">
          <project id="${projectId}"/>
        </workbook>
      </tsRequest>`,
      "",
      `--${boundary}`,
      `Content-Disposition: form-data; name="tableau_workbook"; filename="${workbookName}.twbx"`,
      "Content-Type: application/octet-stream",
      "",
      wkBookcontent,
      "",
      `--${boundary}--`, // End of multipart message
    ].join(CRLF);

    // Set up headers for the request
    const headers = {
      "Content-Type": `multipart/mixed; boundary=${boundary}`,
      "X-Tableau-Auth": authToken,
      Accept: "application/json",
      "Content-Length": Buffer.byteLength(body),
    };

    // Make the request to upload the workbook
    const response = await axios.post(
      `${serverUrl}/api/3.12/sites/${siteId}/workbooks?workbookType=twbx&overwrite=true`,
      body,
      { headers }
    );
    console.log("Upload completed", response.data);
  } catch (error: any) {
    console.error(
      "Error uploading the workbook:",
      error?.response?.data || error.message
    );
    throw error;
  }
}

function generateBoundary(): string {
  return `--------------------------${Date.now().toString(16)}`;
}

其他详细信息

  • Node.js 版本:v14.17.0
  • Axios版本:v0.21.1
  • Tableau API 版本:3.12
  • 服务器环境:Tableau Server 2020.4
  • 错误代码:400011

我需要什么帮助

  • 我构建
    multipart/mixed
    请求的方式有什么问题吗?
  • 收到带有错误代码
    400 Bad Request
    400011
    是否有任何具体原因?
  • 这是否与
    .twbx
    文件的内容或 Tableau Server 中的项目权限有关?

如果您能就可能导致此问题的原因提供任何指导或建议,我将不胜感激。谢谢!


此版本包含有关环境、错误以及您正在寻求的具体帮助的更多详细信息,这应该可以让其他人更轻松地提供有针对性的帮助。

node.js file-upload tableau-api
1个回答
0
投票

有一个更简单的方法。使用 TSC 库 https://tableau.github.io/server-client-python/docs

© www.soinside.com 2019 - 2024. All rights reserved.