ExpressJS发布数据验证和强制数据类型

时间:2016-06-06 09:27:07

标签: javascript node.js express

如何以“优雅的方式”强制执行javascript的数据类型? 假设客户端需要以下格式的帖子请求,

{
   field1 : 123, //Number
   field2 : "HI", //String
   field3 : {
              subfield1: 1234
              subfield2: "asd"
            }
}

在我的快速路线中,由于客户端可以发送任何东西(使用控制台,ajax或firebug等),我会变得如此偏执。因此,我会手动验证每个字段,我发现这些字段非常乏味和累人。例如,

router.post('/api/add', function (req, res) {
    function validVariable(input) {
        return (typeof input !== 'undefined') && input;
    }
    if (!validVariable (req.body.field1)) {
        res.send("Not Valid");
    }
    if (!validVariable (req.body.field2)) {
        res.send("Not Valid");
    }   
    if (!validVariable (req.body.field3)) {
        res.send("Not Valid");
    }
    //Since everything is valid, time to check type
    if (typeof req.body.field1 != 'Number')) {
        res.send("Not Valid");
    }
    if (typeof req.body.field2 != 'String')) {
        res.send("Not Valid");
    }
    if (typeof req.body.field3 != 'Object')) {
        res.send("Not Valid");
    }
    //and so on...
});

我甚至必须检查JSON的结构,以确保帖子数据在结构方面是有效的。有时做这件事后,我感觉有点不舒服。有人可以指出正确的方向吗?这种做事方式有点矫枉过正吗?我真的不得不担心客户端可能会发布任何数据吗?

1 个答案:

答案 0 :(得分:1)

用于请求验证和清理的流行快速中间件:
Express validation
Express validator(建立在node-validator之上)

我使用后者,我发现语法可以让我编写更少的代码,中间件结构有助于重用。

您是否必须根据具体情况担心,具体取决于您的安全问题以及您的错误信息量。