使用 Express,我可以自动 trim req.body 中所有传入的 POSTed 字段吗?

Using Express, can I automatically trim all incoming POSTed fields in req.body?

我开始使用 express-form 和我的 api (Express 3.3.8) 以便 trim 传入 POSTed 字段的前导和尾随空格。

但是,我相信要使用它,我必须在我的中间件中将表单字段和规则包含到我的路由中,如下所示:

app.post('/api/test', form( field("username").trim(), field("password").trim(), function(req, res...

我的问题是,有没有办法在不单独指定字段的情况下自动执行 trim?我知道配置选项:autoTrim,但我认为我仍然需要在每个 route/middleware 的基础上指定字段,对吗?我尝试将它从中间件中移除,只执行 form.configure({autoTrim:true}),但 req.body 字段没有任何变化。就像我根本没有包含 express-form 一样。

我不承诺 express-form。如果有另一种方法可以让 Express 始终 trim 传入 req.body 字段,请告诉我。

似乎必须使用 express-form 单独声明字段,我决定暂时编写自己的空白修剪中间件,因为我找不到现有的简单解决方案。我使用 underscore.js,所以您会看到它的 map 功能正在使用中。您可以使用本机 Object.keys 或类似的其他方式进行自己的循环。这完全重写了 req.body 中的所有字段!请注意,这是解决更大验证问题的权宜之计。我们只是暂时这样做,直到我们有时间清理整个验证。这是我的代码(当然放在 app.use(app.router) 之前):

var trimmer = function(req, res, next){
  req.body = _.object(_.map(req.body, function (value, key) {
    return [key, value.trim()];
  }));
  next();
}

app.use(trimmer);
app.use(postTrimmer);

function postTrimmer(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();
}

在使用postTrimmer中间件之前不要忘记打开"body-parser"模块。

我为此创建了一个 npm 模块。它为您提供了 4 个中间件,您可以使用它们来 trim req.body、req.query、req.params 或所有这三个。它还提供了一个单独的实用程序,您可以使用它来 trim 任何对象。 该模块递归工作,因此无论字符串在对象中的嵌套程度如何,都将是 trimmed.

request_trimmer

npm i request_trimmer

const express =  require('express');
const app = express();
    
const { trim_all,trim_body,trim_params,trim_util } = require('request_trimmer');
app.use(express.json());
#trim request body and query.
app.use(trim_all)