用于嵌套 req.body 数据的 ExpressJs Trim 中间件

ExpressJs Trim middleware for nested req.body data

我如何创建一个中间件来 trim 所有 req.body 数据甚至 NESTED 数据?

我也接受一个值得信赖的编码良好的包裹。

请注意,我在这里使用 trueapp.use(bodyParser.urlencoded({ extended: true }));

此代码参考

  trim: (req, res, next) => {
    if (req.method === 'POST') {
      for (const [key, value] of Object.entries(req.body)) {
        if (typeof value === 'string') req.body[key] = value.trim();
      }
    }
    next();
  }

这个可以工作,但不适用于嵌套数据

在一行中实现此目的的一种方法是利用 JSON.stringify 的 replacer 功能中内置的递归,检查值是数字还是字符串然后 trim 它,然后将结果解析回一个对象。

let obj = {
  "a": "f",
  "b": {
    "c": " g",
    "d": "h",
    "x": {
      "a": [
       '1 ', '2 ', '3 '
      ]
    }
  },
  "e": " value3 "
};

obj = JSON.parse(JSON.stringify(obj, (k, v) => ['string', 'number'].includes(typeof v) ? v.trim() : v))

console.log(obj)

或者你可以使用一个递归函数,如果值是对象,数组然后调用这个函数,很多关于它的例子,做一个搜索。

您可以递归地遍历每个对象和数组,并trim相应地

function trim(body) {
  for (const key in body) {
    if (typeof body[key] === "object" || Array.isArray(body[key])) {
      trim(body[key]);
    } else if (typeof body[key] === 'string') {
      body[key] = body[key].trim();
    }
  }
};

handleReq: (req, res, next) => {
  if (req.method === 'POST') {
    trim(req.body);
  }
  next();
}