Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Express.js路由是否带有可选参数?_Node.js_Express - Fatal编程技术网

Node.js Express.js路由是否带有可选参数?

Node.js Express.js路由是否带有可选参数?,node.js,express,Node.js,Express,我有两种情况需要从数据库中获取数据 显示正常数据 http://exampleapp.com/task/{{taskId}} 通过过帐编辑数据 http://exampleapp.com/task/{{taskId}}/?state={{app.state}} 两个url具有相同的http://exampleapp.com/task/{{taskId}与最后一个短语有点不同?state={{app.state} 我使用快速路由,如下所示: app.get('/task/:taskId/(

我有两种情况需要从数据库中获取数据

  • 显示正常数据

    http://exampleapp.com/task/{{taskId}}
    
  • 通过过帐编辑数据

    http://exampleapp.com/task/{{taskId}}/?state={{app.state}}
    
  • 两个url具有相同的
    http://exampleapp.com/task/{{taskId}
    与最后一个短语
    有点不同?state={{app.state}

    我使用快速路由,如下所示:

    app.get('/task/:taskId/(?state=:status(pending|cancel|confirmed|deleted))?', routes.task.show);
    
    但我不知道为什么它不起作用

    例如错误:转到h**p://exampleapp.com/task/51d2c53f329b8e0000000001时无法获取/task/51d2c53f329b8e0000000001根据,不能将RegExp路由与字符串路由混合使用

    您应该这样做(我假设
    taskId
    是一个整数):

    但是,我不明白为什么您不能只检查路由中是否定义了
    req.query.state
    。它可能不太容易出错,而且更容易:

    app.get("/task/:taskId", function( req, res, next ) {
      if (req.query.state) {
        // Do things
      }
    
      next();
    });
    

    无法在路由中定义查询字符串。您可以从
    req.query
    访问查询字符串参数

    app.get('/task/:taskId', function(req, res) {
        if (req.query.state == 'pending') { ... }
    });
    
    但是,如果要修改任务,这不是适当的方法
    GET
    请求应该是幂等的:请求不应该修改状态。这就是
    POST
    请求的目的

    app.get('/task/:taskId', function(req, res) {
        // show task info based on `req.params.taskId`
    });
    
    app.post('/task/:taskId', function(req, res) {
        // set task `req.params.taskId` to state `req.body.state`
    });
    
    您可以使用一个发布到任务的
    ,或者发出ajax请求:

    $.post('/task/1', { state: 'pending' }, function() { ... });
    

    您的问题是在路由中没有考虑查询字符串。您必须重新设计url(即,将状态包含到url本身中,而不是查询字符串中),或者在路由处理程序函数中检查查询字符串。

    您能详细介绍一下所看到的内容吗?我假设你实际上有两条路线,一条用于你需要支持的每种情况?你能把两者都拿出来吗?其中一个有效吗?在上面设置了路由器之后,当导航到时,我得到了一个错误:无法获取/task/51d2c53f329b8e0000000001,因为两个URL几乎相同,所以在使用查询状态修改代码后,我合并成了一个路由,它可以正常工作。ThanksI修改了我的代码,在从url获取查询字符串后使用put-to-update,现在可以使用了。无论如何,谢谢你的帮助
    $.post('/task/1', { state: 'pending' }, function() { ... });