Comments (5)
报错详情
LTS 版本18.15.0 的 Node.js 调用 im.image.create
方法会有问题,报错基本一致;切到版本 16.20.0 就没有问题。
[
[
TypeError: source.on is not a function
at DelayedStream.create (/xxx/node_modules/.pnpm/[email protected]/node_modules/delayed-stream/lib/delayed_stream.js:33:10)
at CombinedStream.append (/xxx/node_modules/.pnpm/[email protected]/node_modules/combined-stream/lib/combined_stream.js:45:37)
at FormData.append (/xxx/node_modules/.pnpm/[email protected]/node_modules/form-data/lib/form_data.js:75:3)
at build (/xxx/node_modules/.pnpm/[email protected]/node_modules/axios/lib/helpers/toFormData.js:63:16)
at each (/xxx/node_modules/.pnpm/[email protected]/node_modules/axios/lib/helpers/toFormData.js:58:9)
at Object.forEach (/xxx/node_modules/.pnpm/[email protected]/node_modules/axios/lib/utils.js:276:12)
at build (/xxx/node_modules/.pnpm/[email protected]/node_modules/axios/lib/helpers/toFormData.js:40:13)
at toFormData (/xxx/node_modules/.pnpm/[email protected]/node_modules/axios/lib/helpers/toFormData.js:67:3)
at Object.transformRequest (/xxx/node_modules/.pnpm/[email protected]/node_modules/axios/lib/defaults/index.js:80:14)
at transform (/xxx/node_modules/.pnpm/[email protected]/node_modules/axios/lib/core/transformData.js:18:15)
]
]
溯源 - 直接原因
在 Node 16 里,CombinedStream.append
调用传进来的数据是一个 Buffer
:
但是在 Node 18 里,CombinedStream.append
调用传进来的数据是一个 Blob
:
CombinedStream.isStreamLike
这个方法显然没有考虑 Blob 这种情况,显而易见的就把 Blob
当作 Stream
交给了 DelayedStream.create
处理,结果调用了不存在的 on
方法,报错。
接下来找找根本原因。
溯源 - 根本原因
在 Nodejs 16 中,追踪整个调用栈上的参数类型,在 build
之前都是 Uint8Array
,build
之后都是 Buffer
,看起来没什么问题。
那问题应该与 build
方法有关,我们检查下 build
的逻辑。
convertValue
中有转换类型的逻辑,在 formData.append
入参中,类型已经从 Uint8Array
转为了 Buffer
,我们检查下逻辑:
哦吼,看到问题了,Nodejs 16 中没有 Blob
这种类型,所以用的是 Buffer
来承载数据;但是 Nodejs 18 中有了 Blob
就会优先使用 Blob
类型;刚好碰到一个类型校验不严谨的(笑),就搞了个 bug。
解决方案
在聊解决方案之前,让我先吐槽下这个类型断言逻辑,这种逻辑是哪个天才想出来的,不是 Buffer 就是 Stream?这不是妥妥的瞧不起 null 和 undefined 一大家子吗?
我扔个 global 进去都能搞崩(笑)。
正确的处理逻辑应当使用 instanceof ReadStream
或者 instanceof Stream
方式,起码逻辑应该是:我认出来你是 Stream,你才是 Stream,否则我就不支持。
有两个方案解决:
- 降级 Nodejs 到不支持
Blob
特性的低版本,或者在全局干掉Blob
对象(有风险) - 私有仓库发个
[email protected]
版本的同名包给替换掉,这玩意已经好几年没更新了,别指望作者能修问题
上述建议仅供参考,如有问题欢迎指出。
from node-sdk.
1.17.1版本以上可以使用stream代替buffer,1.17.1以下版本需要对image字段ts-ignore一下:
const file = fs.createReadStream('your url');
client.im.image.create({
data: {
image_type: 'message',
image: file
}
}).then(res => {
console.log(res);
}).catch(e => {
console.log(e);
});
from node-sdk.
呃另外我不太会 JS,这个上传脚本是 ChatGPT 帮忙写的,但我大致看了下没啥毛病,出错的地方在 larkclient API 调用上,其他逻辑看起来没问题。
from node-sdk.
厉害呀同学,ChatGPT可以的。
我试了一下正常的调用链路是可以的:
可以先试试发送单个图片看看?排除下文件本身的原因
from node-sdk.
感谢同学提供思路,我这边看下尽快修复
from node-sdk.
Related Issues (20)
- approval 事件订阅缺失 HOT 3
- Can not upload files HOT 5
- 想问下code-gen是如何自动生成的 HOT 1
- 这个验证请求的代码是不是有问题 HOT 3
- 审批实例状态变更 这个事件可以用EventDispatcher来进行处理吗 HOT 1
- EventDispatcher 收到消息后不分发 HOT 1
- 字节内部也能用吧? HOT 2
- 下载文件能否支持直接导出流? HOT 1
- 【BUG】发送消息失败 HOT 18
- 多维表格:获取字段类型错误 HOT 3
- bug: 多维表格下的查询记录接口问题 HOT 2
- BUG:多维表格添加记录无法记录字段内容 HOT 1
- 新卡片回传交互结构类型不支持 HOT 2
- 文档错误 HOT 1
- 延时更新消息卡片接口不支持 HOT 1
- yarn.lock 中包含字节内网registry地址 HOT 1
- 请问支持在Cloudflare worker 中使用吗? HOT 1
- drive.file.bitable_record_changed_v1 缺失 HOT 5
- 批量获取用户信息接口中应该如何填写多个userId HOT 4
- please update lodash.pick version
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from node-sdk.