Mongoose提交字符串数组报Cast to string failed错误如何解决
错误原因
该类型转换错误是由前端代码错误 + 可选的传参格式问题共同导致的,对应修复步骤如下:
修复步骤
1. 修复Form.js逻辑错误
你现有代码存在3处明显语法/逻辑问题,直接替换onChange方法即可:
const onChange = async (event) => { dispatch({ type: START_LOADING }); // 初始化为空数组而非空字符串,否则调用push方法会直接报错 let imgArr = []; let obj = event.target.files; for (let i = 0; i < obj.length; i++) { try { // 取当前遍历的第i个文件,不要永远取第一个文件obj[0] const file = obj[i]; const image = await resizeFile(file); imgArr.push(image); } catch (err) { console.log(err); } } // 直接用处理好的imgArr变量,不要加引号、不要额外套一层数组 setPostData({ ...postData, selectedFile: imgArr }); dispatch({ type: END_LOADING }); };
2. 修复接口传参格式(仅使用FormData提交时需要)
如果你是用FormData对象封装请求参数,不能直接把数组塞进去,否则数组会被浏览器自动转成字符串传到后端,导致Mongoose识别错误,对应处理逻辑:
const formData = new FormData(); Object.keys(postData).forEach(key => { if (key === 'selectedFile' && Array.isArray(postData[key])) { // 数组类型逐个append,后端会自动解析为数组格式 postData[key].forEach(item => formData.append(key, item)); } else { formData.append(key, postData[key]); } }) // 后续用formData作为请求体提交即可
3. Schema兜底配置(可选)
你的Schema里selectedFile: [String]写法本身是正确的,建议补全默认值避免空值报错:
selectedFile: { type: [String], default: [] }
4. 缓存清理(仍报错时执行)
如果修复后还是提示同样的类型转换错误,说明Mongoose加载的是旧版Schema缓存,删除node_modules/.cache文件夹后重启后端服务即可。
内容的提问来源于stack exchange,提问作者snir.hak
相关产品推荐
相关产品推荐

