使用Cloudflare API上传Worker脚本失败:提示“Main module name is not present in bundle”
Cloudflare API上传Worker脚本失败:提示“Main module name is not present in bundle”
我之前也碰到过类似的问题,大概率是表单数据的处理细节没到位,你可以试试调整这几个地方:
1. 不要手动设置Content-Type为multipart/form-data
Axios会自动根据你传入的FormData对象生成带有正确boundary的请求头,手动设置反而会丢失这个关键的boundary信息,导致Cloudflare无法正确解析表单内容。所以把请求头里的'Content-Type': 'multipart/form-data'删掉就好。
2. 正确添加脚本文件到FormData
你直接把字符串作为main.js的值添加到表单里,Cloudflare可能无法识别这是一个合法的脚本文件。应该把代码包装成Blob对象,同时明确指定文件名,确保和metadata里的main_module完全一致:
form.append('main.js', new Blob([workerCode], { type: 'application/javascript' }), 'main.js');
3. 给metadata指定正确的Content-Type
默认情况下,FormData会把metadata的内容当成普通文本传递,Cloudflare可能无法解析成JSON格式的元数据。同样把metadata包装成Blob并指定application/json类型:
form.append( 'metadata', new Blob([JSON.stringify({ main_module: 'main.js', compatibility_date: '2025-02-04', compatibility_flags: ['nodejs_compat'], })], { type: 'application/json' }) );
修正后的完整代码
const api = axios.create({ baseURL: 'https://api.cloudflare.com/client/v4', headers: { Authorization: `Bearer ${myToken}`, // 移除手动设置的Content-Type }, }) const workerCode = `export default { async fetch(request, env, ctx) { return new Response("Hello World!"); }, };` const form = new FormData(); // 正确添加脚本文件 form.append('main.js', new Blob([workerCode], { type: 'application/javascript' }), 'main.js'); // 正确添加元数据 form.append( 'metadata', new Blob([JSON.stringify({ main_module: 'main.js', compatibility_date: '2025-02-04', compatibility_flags: ['nodejs_compat'], })], { type: 'application/json' }) ); await api.put( `/accounts/${accountId}/workers/scripts/${workerName}`, form );
你手动在控制台上传能成功,是因为控制台帮你自动处理了这些表单格式的细节,而API调用需要更精确地符合Cloudflare的要求,调整后应该就能解决这个问题了。
备注:内容来源于stack exchange,提问作者Boris K
相关产品推荐
相关产品推荐

