Express(NodeJS)中具有动态参数匹配问题的网址

时间:2019-05-10 20:19:02

标签: node.js express

我在Express 4.16(和节点12.1.0)中使用动态GET参数的路由存在问题:该路由从不被命中,而仅适用于某些值。

我想打的那条路线是:

app.get('/done/:taskid', function(req, res){

对于taskid = 0或taskid = 1,路由永远不会匹配,我只是找不到原因。对于taskid> 1来说,它可以很好地工作。实际上,除0或1之外的每个值都可以工作(字符串,null等)。

该应用程序不会崩溃,我没有收到任何日志,但是从未执行与该路由相关的代码,而是将我重定向到

app.get('/', function(req, res){

我在NodeJS中是一个非常新的人,所以这可能是一个基本错误,但我只是不能专心致志。

这是我main.js的完整代码:

const app = require('express')();
const twig = require('twig');
const bodyparser = require('body-parser');

app.set('views', __dirname + "/views");
app.set('view engine', 'twig');
app.use(bodyparser.urlencoded());

var todolist = [];

app.get('/', function(req, res){
  res.setHeader('Content-Type', 'text/html');
  res.render('index.html.twig', {todolist: todolist});
});

app.get('/done/:taskid', function(req, res){
  console.log(req.params);
});

app.post('/new', function(req, res){
  //insert in DB later
  todolist.push({
    name: req.body.taskName,
    done: false
  });
  res.redirect(301, '/');
});

app.listen(8000);

我正在尝试通过一个简单的链接进行访问:

<a class="btn btn-sm btn-primary" href="/done/0">Mark as done</a>

通过pm2或节点运行应用程序不会更改任何内容。

有人对我如何在链接中传递等于0或1的id并成功匹配此路由有什么见解?

=================

编辑:因此,显然没有错误……或至少与URL匹配无关。由于某种原因,该请求被置于“停止”状态,并且有足够长的时间让我认为该请求与任何内容都不匹配(> 1分钟)。这很奇怪,因为我在本地主机上的docker容器中运行了此应用程序。我只有1个标签页处于打开状态,并且在进行几次测试之前,请确保关闭并重新启动该应用程序,因此,我很确定只有1个客户端向我的应用程序发出请求... 我昨天睡觉,今天早上回来,完全相同的代码开始工作。 我真的不知道发生了什么事。

=================

编辑2:做了一些测试,找到了一个模式。问题似乎与铬有关。 代码与Firefox和Safari完美配合。使用Chrome失败100%的时间...但是,如果打开控制台面板,则使用Chrome可以100%的时间...就像错误是有感觉的,仅在没有人看的情况下发生...

1 个答案:

答案 0 :(得分:0)

因此,通过将我的<a href="">更改为<form method="post" ...>并相应地更改了路线,解决了该问题。仍然不知道是什么引起了问题,但现在可以解决。

评论中提供的链接Andrew提示chrome会在点击之前预取我的链接并修改我的数据。没有解释为什么我没有想到任何日志。

故事的道德修炼者:不要使用GET方法来修改/删除数据。