多机器人协作运输系统的强化学习实现与优化
2026/5/10 4:39:43
在 Nuxt3 SSR(服务端渲染)项目中,使用 FormData 时遇到以下错误:
FormData is not defined这个错误通常出现在服务端渲染时,因为 Node.js 环境默认没有 FormData API。
// utils/formData.tsexportclassUniversalFormData{privatedata:Map<string,string|Blob>=newMap()constructor(form?:HTMLFormElement){if(form&&typeofwindow!=='undefined'){// 浏览器环境:从表单提取数据constformData=newFormData(form)for(let[key,value]offormData.entries()){this.data.set(key,value)}}}append(name:string,value:string|Blob,fileName?:string):void{this.data.set(name,value)}delete(name:string):void{this.data.delete(name)}get(name:string):FormDataEntryValue|null{returnthis.data.get(name)||null}getAll(name:string):FormDataEntryValue[]{constvalues:FormDataEntryValue[]=[]constvalue=this.data.get(name)if(value!==undefined){values.push(value)}returnvalues}has(name:string):boolean{returnthis.data.has(name)}set(name:string,value:string|Blob,fileName?:string):void{this.data.set(name,value)}entries():IterableIterator<[string,FormDataEntryValue]>{returnthis.data.entries()}keys():IterableIterator<string>{returnthis.data.keys()}values():IterableIterator<FormDataEntryValue>{returnthis.data.values()}forEach(callbackfn:(value:FormDataEntryValue,key:string,parent:FormData)=>void):void{this.data.forEach(callbackfn)}// 获取原生 FormData(仅在浏览器环境)getNativeFormData():FormData|null{if(typeofwindow!=='undefined'){constformData=newFormData()this.data.forEach((value,key)=>{formData.append(key,value)})returnformData}returnnull}// 获取普通对象(服务端环境使用)toObject():Record<string,any>{constobj:Record<string,any>={}this.data.forEach((value,key)=>{if(valueinstanceofBlob){// Blob 处理逻辑...obj[key]='[Blob data]'}else{obj[key]=value}})returnobj}}// 兼容性导出exportconstcreateFormData=(form?:HTMLFormElement)=>{returnnewUniversalFormData(form)}// composables/useApi.tsimport{createFormData}from'~/utils/formData'exportconstuseApi=()=>{constconfig=useRuntimeConfig()constapiRequest=async(url:string,options:any={})=>{try{// 处理 FormDataif(options.bodyinstanceofFormData){if(typeofwindow!=='undefined'){// 浏览器环境:直接使用原生 FormDataconstresponse=await$fetch.raw(url,{...options,baseURL:config.public.apiBase})returnresponse}else{// 服务端环境:转换为普通对象constformData=createFormData()// 手动添加数据...constdataObject=formData.toObject()options.body=dataObject}}constresponse=await$fetch.raw(url,{...options,baseURL:config.public.apiBase})returnresponse}catch(error){console.error('API request failed:',error)throwerror}}return{apiRequest}}// nuxt.config.tsexportdefaultdefineNuxtConfig({// ... 其他配置vite:{optimizeDeps:{exclude:['axios','form-data']},ssr:{noExternal:true},}})optimizeDeps.exclude
ssr.noExternal
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 原生 API + 兼容层 | 性能最好,代码简洁 | 需要手动实现兼容逻辑 | Node.js 18+ 项目 |
| Vite 配置优化 | 配置简单,快速解决 | 可能增加包大小 | 紧急修复,兼容旧版本 |
exportconstisClient=typeofwindow!=='undefined'exportconstisServer=typeofwindow==='undefined'exportconsthandleFormDataError=(error:any)=>{console.error('FormData error:',error)// 统一的错误处理逻辑}interfaceFormDataLike{append(name:string,value:string|Blob):voidget(name:string):FormDataEntryValue|null// ... 其他方法}// 测试服务端是否能正确处理 FormDatadescribe('FormData SSR',()=>{it('should work in server environment',()=>{constformData=createFormData()formData.append('test','value')expect(formData.get('test')).toBe('value')})})// 测试浏览器环境describe('FormData Client',()=>{it('should work in browser environment',()=>{constformData=createFormData()constnativeForm=formData.getNativeFormData()expect(nativeForm).toBeInstanceOf(FormData)})})A:Nuxt3 的 SSR 过程中,代码先在 Node.js 环境执行,而传统 Node.js 没有 FormData API。
A:可以,但需要注意版本兼容和打包配置,推荐使用 Node.js 18+ 原生 API。
A:使用统一的兼容层,或者配置 Vite 确保依赖打包一致性。
FormData 在 Nuxt3 SSR 环境下的兼容性问题,主要通过以下方式解决:
这个解决方案不仅解决了当前问题,还为未来类似的环境兼容问题提供了参考模式。
关键词:Nuxt3, SSR, FormData, 兼容性, Node.js, Vite, 服务端渲染