Express Router param validation

时间:2015-05-27 00:50:19

标签: node.js express

快递4x api文档声称您可以将正则表达式作为第二个参数传递给router.param,以便验证参数。

  

现在可以使用该方法有效地验证参数(和   可选地解析它们以提供捕获组)

然后提供以下示例。

// validation rule for id: should be one or more digits
router.param('id', /^\d+$/);

router.get('/user/:id', function(req, res) {
  res.send('user ' + req.params.id);
});

// validation rule for range: should start with one more alphanumeric characters, followed by two dots, and end with one more alphanumeric characters
router.param('range', /^(\w+)\.\.(\w+)?$/);

router.get('/range/:range', function(req, res) {
  var range = req.params.range;
  res.send('from ' + range[1] + ' to ' + range[2]);
});

但是,这实际上似乎没有用。进一步深入研究,看起来express code实际上并不支持文档所声称的内容。事实上,传递函数以外的任何东西都会让你得到一个整洁的invalid param() call例外。

运用

表达4.12.3
节点0.12.4

所以我的问题是这个功能是否真的存在,或者我是否做错了什么。我正在尝试完成文档中提供的相同内容但是我收到了上面提到的错误。任何指导将不胜感激:)

2 个答案:

答案 0 :(得分:7)

答案可以找到here

如果您使用快速router.param(fn),则基本上需要在之前运行以下代码段,以利用上述<= 4.11方法。

表达 4.11

router.param(function(name, fn) {
  if (fn instanceof RegExp) {
    return function(req, res, next, val) {
      var captures;
      if (captures = fn.exec(String(val))) {
        req.params[name] = captures;
        next();
      } else {
        next('route');
      }
    }
  }
});

表达 4.12

如果您使用快速>= 4.12,则可以使用以下内容{/ 1}}完成相同的而不需要router.param(fn)。事实上,上面的4.12示例将弹出一个弃用警告。

app.get('/user/:userId([0-9]+)', fn);

虽然在文档中说明了这一点,但它并不十分清楚。
希望这会有所帮助。

答案 1 :(得分:0)

我遇到了同样的问题,我通过转换代码解决了这个问题

exports.customerValidator = () => {
    return [
        body("name").trim().toString(),
        body("email")
          .isEmail()
          .withMessage("Please enter a valid email id")
          .custom((value, { req }) => {
            return Customer.findOne({ email: value })
              .then((customer) => {
                if (customer) {
                  return Promise.reject("E-mail address is already exists!");
                }
              })
          })
          .normalizeEmail(),
        body("address").trim().toString(),
        body("city").trim().toString()
    ]
}

为此:

exports.customerValidator = () => {
    return [
      body('name').trim(),
      body("email")
        .isEmail()
        .normalizeEmail()
        .custom((value, { req }) => {
          return Customer.find({ email: value })
            .then((customer) => {
              if (customer) {
                return Promise.reject("E-mail address is already exists!");
              }
            })
        }),
      body("address").trim(),
      body("city").trim(),
    ];
  };