我有一个上面定义的路线
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">❮</button></li>
<li class="next"><button type='submit' name='next'>❯</button></li>
</form>
要正确运行,表单应该能够在用户点击第一个按钮时传递两个参数'prev',在点击第二个按钮时传递'next'。
答案 0 :(得分:2)
尝试为提交按钮指定相同的名称,但值不同:
<form method="post" action="/calendar">
<li class="prev">
<input type="submit" name="move" value="prev">❮</input>
</li>
<li class="next">
<input type="submit" name="move" value="next">❯</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">❮</input>
</li>
<li class="next">
<input type="submit" name="move" value="next">❯</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();
}
};