如何在nodejs中通过相同的表单传递两个不同的参数

时间:2017-01-22 21:02:13

标签: node.js express

我有一个上面定义的路线

app.post('/calendar/:move', calendar.verifyMoveParam, calendar.move);

中间件verifyMoveParam用于验证通过url传递的参数是下一个还是上一个,代码如上:

// POST /calendar/:move
  controller.verifyMoveParam = function(req, res, next) {

    if(req.params.move.search(/^(next|prev)$/) === -1) {
      var err = new Error('Not Found');
      err.status = 404;
      next(err);
    } else {
      req.move = req.params.dir;
      next();
    }

  };

然后转移到移动中间件,该中间件应具有上述所有逻辑代码:

// POST /calendar/:move
  controller.move = function(req, res) {

    if(req.move == 'next') {
      // do something
    } else {
      // do something else
    }

    res.render('calendar', {});

  };

但我不知道如何通过表单模板传递两个不同的参数:

<form method='post' action='/calendar'>
  <li class="prev"><button type="submit" name="prev">&#010094;</button></li>
  <li class="next"><button type='submit' name='next'>&#010095;</button></li>
</form>

要正确运行,表单应该能够在用户点击第一个按钮时传递两个参数'prev',在点击第二个按钮时传递'next'。

2 个答案:

答案 0 :(得分:2)

尝试为提交按钮指定相同的名称,但值不同:

<form method="post" action="/calendar">
    <li class="prev">
        <input type="submit" name="move" value="prev">&#010094;</input>
    </li>
    <li class="next">
        <input type="submit" name="move" value="next">&#010095;</input>
    </li>
</form>

现在您有2个提交按钮具有相同的name="move",并且根据单击的那个按钮,您的服务器端应用程序将收到move参数的相应值(prev或{ {1}})你可以测试:

next

答案 1 :(得分:1)

因此,您的代码存在一些问题。首先,您当前的路由正在查找move参数,该参数将位于URL路径结构中。如果没有额外的客户端欺骗,这些按钮不会影响,这并不是很好。

此外,即使您这样做,您的中间件也不一致;在一个地方,您正在寻找req.params.move,在另一个地方,您正在寻找req.params.dir

鉴于您正在使用POST操作,最合理的放置方向的地方是在POST的主体中,而不是在params或querystring中。所以@DarinDimitrov说,你的表格应改为:

<form method="post" action="/calendar">
    <li class="prev">
        <input type="submit" name="move" value="prev">&#010094;</input>
    </li>
    <li class="next">
        <input type="submit" name="move" value="next">&#010095;</input>
    </li>
</form>

但您的路由和中间件也需要更改才能处理。

// route doesn't need the :move param anymore
app.post('/calendar', calendar.verifyMoveParam, calendar.move);

// POST /calendar
  controller.verifyMoveParam = function(req, res, next) {

    if(req.body.move.search(/^(next|prev)$/) === -1) {
      var err = new Error('Not Found');
      err.status = 404;
      next(err);
    } else {
      req.move = req.body.move;
      next();
    }

  };