Autodesk Forge - 将文件作为块上传到 Node JS 中的 BIM 360 存储时出现 504 网关超时

Posted

技术标签:

【中文标题】Autodesk Forge - 将文件作为块上传到 Node JS 中的 BIM 360 存储时出现 504 网关超时【英文标题】:Autodesk Forge - 504 Gateway Timeout when uploading file as chunks to BIM 360 storage in Node JS 【发布时间】:2020-10-12 05:35:58 【问题描述】:

当我尝试使用 Autodesk forge 中的 PUT 对象可恢复 API 端点以“块”形式上传大文件时,出现 504 网关超时。

https://forge.autodesk.com/en/docs/data/v2/reference/http/buckets-:bucketKey-objects-:objectName-resumable-PUT/

我的控制台日志输出如下,显示 504 响应以及我发送的 PUT 请求。

我尝试了各种方法,既使用 Node 中 forge-apis SDK 中的函数(例如 ObjectsAPI 中的 uploadChunk 方法),也使用 requestrequest-promise-native 编写了各种函数来检查如果使用 await/async,promises vs callbacks 可以帮助解决问题。

在所有情况下,我都会得到相同的响应 - 日志中长时间停顿,然后出现 504 网关超时 - 这似乎来自 Forge 端。

对于上下文,我的 Node JS 应用程序位于 Heroku 上,并由在客户端本地运行的 python 脚本触发 - 所以 Heroku 是“中间人” - 身份验证从客户端通过 python 传递到节点应用程序,然后传递给 Forge 进行身份验证。流程中的其他操作均成功,因此我确信身份验证正常工作。

任何人都可以从我下面的日志中看到任何可能导致问题的内容吗?其他人在大文件的分块上传时遇到过类似的 504 问题吗? (在这种情况下约为 130MB)

第一个日志显示我的控制台日志输出 - 我以 1 秒的间隔发送 5mb 块,并将块作为切片以匹配 Content-Range 的 Buffer 对象(字节)发送

2020-06-22T10:42:33.389835+00:00 app[web.1]: Ready to upload chunk...
2020-06-22T10:42:33.389896+00:00 app[web.1]: simulating waiting for 1000 milliseconds
2020-06-22T10:42:34.391034+00:00 app[web.1]: done waiting
2020-06-22T10:42:34.392893+00:00 app[web.1]: contentRange bytes 129999974-130056191/130056192
2020-06-22T10:42:34.393393+00:00 app[web.1]: requestParams 
2020-06-22T10:42:34.393394+00:00 app[web.1]: headers: 
2020-06-22T10:42:34.393395+00:00 app[web.1]: Authorization: 'Bearer eyJhbGciOiJIxxxxxxxxx',
2020-06-22T10:42:34.393396+00:00 app[web.1]: 'Content-Type': 'application/octet-stream',
2020-06-22T10:42:34.393396+00:00 app[web.1]: 'Content-Range': 'bytes 129999974-130056191/130056192',
2020-06-22T10:42:34.393397+00:00 app[web.1]: 'Content-Length': '130056192',
2020-06-22T10:42:34.393397+00:00 app[web.1]: 'Session-Id': '-75601742'
2020-06-22T10:42:34.393397+00:00 app[web.1]: ,
2020-06-22T10:42:34.393398+00:00 app[web.1]: uri: 'https://developer.api.autodesk.com/oss/v2/buckets/wip.dm.prod/objects/1fad0fad-601b-41b8-bce4-c88edbb353ec.rvt/resumable',
2020-06-22T10:42:34.393399+00:00 app[web.1]: url: 'https://developer.api.autodesk.com/oss/v2/buckets/wip.dm.prod/objects/1fad0fad-601b-41b8-bce4-c88edbb353ec.rvt/resumable',
2020-06-22T10:42:34.393399+00:00 app[web.1]: method: 'PUT',
2020-06-22T10:42:34.393400+00:00 app[web.1]: body: <Buffer 6b b1 b4 e4 d7 f5 1e 59 a0 07 0c db 68 7d 9e 98 75 8e 5f fc e8 0c e3 78 a0 9c b9 59 3f e9 0f 28 e5 5a f0 eb 75 7b 68 16 3d 4c c1 ca 20 7a ba 67 f0 69 ... 56167 more bytes>,
2020-06-22T10:42:34.393400+00:00 app[web.1]: resolveWithFullResponse: true
2020-06-22T10:42:34.393400+00:00 app[web.1]: 
2020-06-22T10:42:34.393466+00:00 app[web.1]: Ready to upload chunk...

每个块的响应都是这样返回的:

2020-06-22T10:43:34.443453+00:00 app[web.1]: Uploading 504 > GATEWAY_TIMEOUT
2020-06-22T10:43:34.443834+00:00 app[web.1]: err:  null
2020-06-22T10:43:34.443969+00:00 app[web.1]: res:  
2020-06-22T10:43:34.443969+00:00 app[web.1]: ----"statusCode": 504,
2020-06-22T10:43:34.443970+00:00 app[web.1]: ----"body": "",
2020-06-22T10:43:34.443970+00:00 app[web.1]: ----"headers": 
2020-06-22T10:43:34.443971+00:00 app[web.1]: --------"content-length": "0",
2020-06-22T10:43:34.443971+00:00 app[web.1]: --------"connection": "Close"
2020-06-22T10:43:34.443971+00:00 app[web.1]: ----,
2020-06-22T10:43:34.443972+00:00 app[web.1]: ----"request": 
2020-06-22T10:43:34.443972+00:00 app[web.1]: --------"uri": 
2020-06-22T10:43:34.443973+00:00 app[web.1]: ------------"protocol": "https:",
2020-06-22T10:43:34.443973+00:00 app[web.1]: ------------"slashes": true,
2020-06-22T10:43:34.443973+00:00 app[web.1]: ------------"auth": null,
2020-06-22T10:43:34.443974+00:00 app[web.1]: ------------"host": "developer.api.autodesk.com",
2020-06-22T10:43:34.443974+00:00 app[web.1]: ------------"port": 443,
2020-06-22T10:43:34.443974+00:00 app[web.1]: ------------"hostname": "developer.api.autodesk.com",
2020-06-22T10:43:34.443974+00:00 app[web.1]: ------------"hash": null,
2020-06-22T10:43:34.443975+00:00 app[web.1]: ------------"search": null,
2020-06-22T10:43:34.443975+00:00 app[web.1]: ------------"query": null,
2020-06-22T10:43:34.443975+00:00 app[web.1]: ------------"pathname": "/oss/v2/buckets/wip.dm.prod/objects/1fad0fad-601b-41b8-bce4-c88edbb353ec.rvt/resumable",
2020-06-22T10:43:34.443976+00:00 app[web.1]: ------------"path": "/oss/v2/buckets/wip.dm.prod/objects/1fad0fad-601b-41b8-bce4-c88edbb353ec.rvt/resumable",
2020-06-22T10:43:34.443976+00:00 app[web.1]: ------------"href": "https://developer.api.autodesk.com/oss/v2/buckets/wip.dm.prod/objects/1fad0fad-601b-41b8-bce4-c88edbb353ec.rvt/resumable"
2020-06-22T10:43:34.443977+00:00 app[web.1]: --------,
2020-06-22T10:43:34.443977+00:00 app[web.1]: --------"method": "PUT",
2020-06-22T10:43:34.443977+00:00 app[web.1]: --------"headers": 
2020-06-22T10:43:34.443978+00:00 app[web.1]: ------------"Authorization": "Bearer eyJhbGciOiJxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
2020-06-22T10:43:34.443978+00:00 app[web.1]: ------------"Content-Type": "application/octet-stream",
2020-06-22T10:43:34.443978+00:00 app[web.1]: ------------"Content-Range": "bytes 129999974-130056191/130056192",
2020-06-22T10:43:34.443978+00:00 app[web.1]: ------------"Content-Length": "130056192",
2020-06-22T10:43:34.443979+00:00 app[web.1]: ------------"Session-Id": "-75601742"
2020-06-22T10:43:34.443979+00:00 app[web.1]: --------
2020-06-22T10:43:34.443979+00:00 app[web.1]: ----
2020-06-22T10:43:34.443979+00:00 app[web.1]: 

【问题讨论】:

【参考方案1】:

感谢我的同事 Luis Felipe Paris - 在按照 Petr 的建议查看 forge-server-utils 之后,我们设法解决了问题。

通过将uploadChunk 函数更改为使用模块axios 而不是requestrequest-promise - 我们发现504 超时错误消失了。

我们使用了 npm 模块 requestrequest-promise(尽管这些天是遗留/已弃用),因为它支持从一个地方到另一个地方的管道流,这适用于我们正在执行的所有其他请求,除了分块上传“可恢复”文件。

我们必须将我们发送的文件负载从Buffer 对象转换为ArrayBuffer,并正确分割它以匹配每个块的Content-Range

一些较旧的伪造示例使用request - 所以我想这可能对其他用户有用 - 如果request 给您带来问题,请尝试axios

【讨论】:

【参考方案2】:

编辑:使用可恢复上传功能时,请确保 Content-Length 请求标头指定只是您要发送的块的长度,而不是上传文件的整个大小。

Forge API 确实有一些速率限制,但在这种情况下,您可能应该得到 4xx 状态码,而不是 504。

你能帮我们试一试吗?

使用此 Node.js 库上传文件:https://github.com/petrbroz/forge-server-utils 使用这个 Visual Studio Code 扩展上传文件(使用相同的 Node.js 库):https://marketplace.visualstudio.com/items?itemName=petrbroz.vscode-forge-tools 从本地应用程序而不是 Heroku 上传文件(只是为了排除 Heroku 和 Forge 服务器之间的网络问题)

如果您仍然无法上传文件,您能否通过forge (dot) help (at) autodesk (dot) com 与我们分享(保密)?我们很乐意对此进行调查。

【讨论】:

嗨,Petr,我很高兴也很荣幸能得到您的帮助!您可能还记得 Forge Accelerator London 上的这一点——我们正在努力将文件从 BIM360 Teams 传输到 BIM 360 Docs……我们当前的挑战是处理 CompositeDesign 文件——它们本质上是包含链接 rvt 文件的 Revit 主机文件,并且出现当我们使用我们的转移应用程序迁移它们时,作为 .zip。 我们当前的挑战是处理 CompositeDesign 文件 - 这些文件本质上是包含链接 rvt 文件的 Revit 主机文件,当我们使用我们的传输应用程序迁移它们时,它们在 360 Docs 中显示为 .zip。目前,我们的节点应用程序正在解压缩文件,然后将解压缩的 .rvt 文件上传到 BIM360,并创建相应文件的新“版本” - 所以这比单独上传文件稍微复杂一些...... 我们在本地测试时确实遇到了相同的 504 错误,没有 heroku(我们还认为这可能与 Heroku 与 Forge 对话有关)我一直在查看 forge-server-utils方法 - 他们似乎正在发送相同的请求信息等...相同的 504 出现在几个不同的文件中,所以我们很确定它不是特定文件的问题这些信息中的任何一个是否更清楚? 嗨,Ed,是的,我记得 :) 你看到的问题很奇怪。我记得上传超过 100MB 的文件没有任何问题。您是否尝试过上传带有 vscode 扩展名的文件?它默认使用可恢复上传,因此只是为了排除上传逻辑中的任何潜在问题。您是否尝试过更小的块大小? 嗨,Petr,当然,我们会尝试使用 vscode 扩展来调试这些步骤。目前我们的块大小是 5MB,所以我认为应该足够小吗? (如果我没记错的话,最少 2MB)同时,如果您能想到我们可能得到 504 的任何其他原因,请告诉我 - 好像 Forge 服务器没有响应,也许我们在请求中遗漏了一些东西? (您可以在我的第一个屏幕截图中看到我们发送的内容)

以上是关于Autodesk Forge - 将文件作为块上传到 Node JS 中的 BIM 360 存储时出现 504 网关超时的主要内容,如果未能解决你的问题,请参考以下文章

Autodesk Forge:添加图像文件指定的图像协议无效

上传 zip 文件以在 Autodesk Forge 中进行翻译

Autodesk Forge 数据文件

如何通过 Autodesk Forge 上的数据管理 API 上传超过 100MB 的大文件?

Autodesk Forge API 上传文件

Autodesk Forge - 指定要上传的文件的路径