如何让Multer将FormData中的字符串数组解析为数组而非逗号分隔的字符串?
如何让Multer将FormData中的字符串数组解析为数组而非逗号分隔的字符串?
嗨,我完全懂你现在的困扰——Multer把FormData里的字符串数组转成了逗号分隔的单字符串,直接用split处理总觉得不够优雅,好像有点辜负Multer帮你解析其他数据的贴心对吧?别担心,有几个更贴合FormData原生逻辑的办法可以解决这个问题:
方案一:前端多次append同一个字段名(最推荐)
FormData本身支持对同一个key执行多次append操作,只要你这么做,Multer在解析时就会自动把这些同key的值拼成一个数组,而不是转成逗号分隔的字符串。你可以修改前端的代码,在处理数组类型的字段时,遍历数组元素逐个添加:
newProduct: {categories: string[]} const formData = new FormData() for (let key of Object.keys(newProduct)) { const value = newProduct[key]; // 识别数组类型的字段 if (Array.isArray(value)) { // 遍历数组,给同一个key逐个添加元素 value.forEach(item => { formData.append(key, item); }); } else { formData.append(key, value); } } const response = await axios.post('/api/products', formData)
这样后端通过req.body.categories拿到的就是['cat1', 'cat2', 'cat3']这样的标准数组了,完全符合你的预期。
方案二:后端解析JSON字符串(备选方案)
如果你之前尝试过用JSON.stringify(categories)把数组转成字符串再append,其实后端也能很优雅地处理,没必要觉得“别扭”——只要在后端拿到这个字符串后用JSON.parse()转成数组就行,比如:
// 后端Express示例代码 app.post('/api/products', upload.none(), (req, res) => { // 解析JSON字符串为数组 const categories = JSON.parse(req.body.categories); // 这里的categories就是你要的数组格式了 // 后续业务逻辑... });
不过这个方法需要前后端提前约定好该字段是JSON格式的字符串,对比方案一,还是更推荐用多次append的方式,毕竟这才是FormData传递数组的原生正确姿势。
另外要提一句:你之前直接把整个数组传给formData.append时,浏览器会自动把数组转成逗号分隔的字符串,这是FormData的默认行为,不是Multer的问题哦~只要前端按照正确的方式传递数组,Multer就能完美解析成数组啦。
备注:内容来源于stack exchange,提问作者Lewis Burgess
相关产品推荐
相关产品推荐

