使用Formidable处理POST请求时字段重复问题排查
问题描述
我有一个包含email和password两个输入框的基础HTML表单,输入框代码如下:
<input type="email" placeholder="Email" name="email" required />
密码输入框代码:
<input type="password" placeholder="Email" name="password" required />
后端使用Formidable解析表单后打印提交的字段,代码如下:
form.parse(req, async (err, fields, files: any) => { if (err) { console.log(err); return res.status(500).json({ msg: "There was an error while processing upload" }); } console.log(fields); return res.json({msg: "done"}) });
首次请求时一切正常,例如提交email为bob@gmail.com、password为123时,后端打印的字段为:
{ email: [ 'bob@gmail.com' ], password: [ '123' ] }
但后续每次POST请求都会出现字段重复的情况,比如第二次提交email为ryan@gmail.com、password为abc时,后端打印的字段变为:
{ email: [ 'ryan@gmail.com', 'ryan@gmail.com' ], password: [ 'abc', 'abc' ] }
第n次提交时,字段数组会包含n个相同的对应值,请问这一现象的原因是什么?
问题原因
这个问题的核心是Formidable实例被重复复用。
如果你的form实例是在全局作用域创建的(比如在请求处理函数外部初始化),每次调用form.parse()时,Formidable会将当前请求的字段值追加到实例已有的字段集合中,而非重置为新的字段数据。
Formidable默认会收集所有解析到的字段,全局实例会在多次请求之间保留状态,导致每次新请求的字段都会被重复添加到数组里,最终出现第n次提交时数组包含n个相同值的情况。
解决方法很直接:每次处理请求时,在请求处理函数内部创建新的Formidable实例,不要复用全局实例。修改后的代码示例:
// 不在全局创建form实例 app.post('/your-endpoint', (req, res) => { // 每次请求都初始化新的Formidable实例 const form = new formidable.IncomingForm(); form.parse(req, async (err, fields, files: any) => { if (err) { console.log(err); return res.status(500).json({ msg: "There was an error while processing upload" }); } console.log(fields); return res.json({msg: "done"}); }); });
内容的提问来源于stack exchange,提问作者awoldt
相关产品推荐
相关产品推荐

