每个 POST 请求上强大的重复字段

Formidable duplicates fields on each POST request

提问人:awoldt 提问时间:8/1/2023 最后编辑:awoldt 更新时间:10/10/2023 访问量:38

问:

我有一个基本的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 封电子邮件和密码,所有这些电子邮件和密码都完全相同。为什么会这样?

Node.js 表单 后端 强大

评论


答:

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);
    });
  };
}

这解决了问题。