提问人:awoldt 提问时间:8/1/2023 最后编辑:awoldt 更新时间:10/10/2023 访问量:38
每个 POST 请求上强大的重复字段
Formidable duplicates fields on each POST request
问:
我有一个基本的html表单,其中包含2个输入,电子邮件和密码。电子邮件输入如下所示
<input type="email" placeholder="Email" name="email" required />
密码输入如下所示
<input type="password" placeholder="Email" name="password" required />
在后端,我记录了使用强大的表单解析表单后提交的字段
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 protected],密码为 123,则后端的字段日志将如下所示
{
email: [
'[email protected]'
],
password: [
'123'
]
}
这很好,但是如果对后端有另一个发布请求,它将复制字段,因此,例如,这次如果电子邮件是 [email protected] 并且密码是 abc,后端字段将如下所示
{
email: [
'[email protected]',
'[email protected]'
],
password: [
'abc',
'abc'
]
}
它基本上会为每个后续的发布请求创建表单值的副本,因此,如果这是第 50 次表单提交,则字段日志将包含 50 封电子邮件和密码,所有这些电子邮件和密码都完全相同。为什么会这样?
答:
0赞
illuminaughty
10/10/2023
#1
我遇到了一个类似的问题,发现这里用于form.parse的表单变量应该为每个新请求初始化。
我之前有这个代码,它正在处理我的快速请求
export function incomingFormRouteHandler(
controllerFn,
) {
const form = new IncomingForm(); // This was outside the returning function
return async (req: Request, res: Response) => {
return form.parse(req, (err, fields, files) => {
if (err) {
await Promise.reject(err)
}
const controller = controllerFn();
controller.execute(Object.assign({}, req, { files, fields }), res);
});
};
}
事实证明,IncomingForm 应该存在于返回的函数中。我将代码修改为以下内容:
export function incomingFormRouteHandler(
controllerFn,
) {
return async (req: Request, res: Response) => {
const form = new IncomingForm(); // Shifted this to inside of the returning function
return form.parse(req, (err, fields, files) => {
if (err) {
await Promise.reject(err)
}
const controller = controllerFn();
controller.execute(Object.assign({}, req, { files, fields }), res);
});
};
}
这解决了问题。
评论