NodeJS Express req.params,使控制器无法正常工作

时间:2014-05-06 16:30:02

标签: javascript node.js express

民间,   尝试将https://github.com/krakenjs/express-enrouten用于我的控制器。

出于某种原因,我无法获得我想要的行为,并且req.params根本没有设置。

app.js:

app.use(bodyParser());
var controllerPath = __dirname + '/controllers';
app.use(enrouten({directory: controllerPath }));

pingController.js:

module.exports = function registerRoutes(app){
    app.get('/', pong);
};

function pong(req, rsp) {

    console.log (req.params);

    rsp.set('Content-Type', 'application/json');
    var response = {
        ping: 'pong',
        service: 'ShuttleService',
        env: process.env.NODE_ENV,
        params: req.params
    };
    rsp.send(response);
};

问题:

    如果我点击req.params ,则
  1. {}{param:foo}而不是http://localhost:3000/pingController?param=foo
  2. 该页面的路线不是http://localhost:3000/,而是实际的文件名,即http://localhost:3000/pingController/
  3. 如果我将app.get('/', pong);替换为app.get('/ping', pong);,则找不到页面...如何让此控制器用于/ping uri而不是uri中的文件名?< / LI>
  4. req.query有效...为什么req.params没有设定?
  5. 如何通过req.params传递?而且,如何获得预期的uri路径行为?

    谢谢!

1 个答案:

答案 0 :(得分:1)

所以,这里是每个项目的答案:

  1. req.params在URL的路径中返回路由参数。如果您想使用param获取参数req.params,则必须在路径中传递它们,因此您的代码应如下所示:

    module.exports = function registerRoutes(app){
      app.get('/:param', pong);
    };
    

    并将其传递到http://localhost:3000/pingController/foo之类的网址中。现在,如果您致电req.params,您将会{ param: foo };

  2. 这是express-enrouten模块的工作方式(参见docs)。根据您的代码,您已经定义了您的控制器将位于controllers目录下。因此,如果您有一个名为pingController的控制器,则调用它的网址为http://localhost:3000/pingController/;

  3. 如果您将/更改为/ping,则到达该网址的网址现为http://localhost:3000/pingController/ping,依此类推;

  4. req.query返回网址查询参数(在?之后,请参阅docs)。当您调用网址http://localhost:3000/pingController?param=foo时,它会返回您的数据。