Node.js / Express获得声明式添加路由

时间:2018-06-24 17:04:24

标签: javascript node.js express routes declarative

我试图在声明性对象中管理我的路由,然后使用一个或多个对象初始化/注册终结点处理程序。

不幸的是,当我尝试在声明性路由,方法和处理程序的循环中注册处理程序时,这些路由似乎未在Express中注册,并且在我尝试访问路由时导致404。

这是一个代码段:

const services = require('./services.js');

const appRoutes = [
  { route: '/x/user', handler: { get: services.getUserName, post: services.getUserName } },
  { route: '/x/ping', handler: { get: services.ping } },
  { route: '/x/mary/had/:foo/little/:animal', handler: { get: (req, res) => res.send({ foo: req.params.foo, animal: req.params.animal }) } }
];

class routes {
  static registerRoutes(app, rs) {
    rs.forEach(r => {
      const rt = r.route;
      const h = r.handler;
      console.log('registerRoutes.routes.forEach: ' + rt + '; hs: ' + h.get);
      if (h.get) app.get(rt, h.get);
      if (h.post) app.post(rt, h.post);
      if (h.delete) app.delete(rt, h.delete);
      if (h.head) app.head(rt, h.head);
      if (h.put) app.put(rt, h.put);
    });
  }
  static initializeRoutes(app) {
    this.initializeDevRoutes(app);
  }
  static initializeDevRoutes(app) {
    const rs = [
      { route: '/z/user', handler: { get: services.getUserName, post: services.getUserName } },
      { route: '/z/ping', handler: { get: (req, res) => res.send('pinged') } }
    ];
    this.registerRoutes(app, appRoutes);
    this.registerRoutes(app, rs);
    app.get('/api/getUsername', services.getUserName); // (req, res) => res.send({ username: os.userInfo().username }));
    app.get('/api/ping', services.ping); // (req, res) => res.send({ ping: new Date() }));
    app.get('/api/mary/had/:foo/little/:animal', (req, res) => res.send({ food: req.params.foo, animal: req.params.animal }));
  }
}

module.exports = routes;

/x/.../z/...路由未成功注册,因为我获得了所有这些路由的404。

但是,由于返回了预期的200个状态结果,因此对于底部的app.get('/api/....)的显式调用必须正确注册路由。

这是我的第一个node / js项目,因此我可能在JS范围和处理闭包方面缺少某些东西。

感谢任何帮助/建议。

谢谢。

1 个答案:

答案 0 :(得分:0)

问题在于我使用npm run dev启动了开发服务器。

浏览器自动打开到开发服务器(在端口3000上运行),该服务器仅将/api代理到实际服务器(在端口8080上运行)(位于{{1}下的webpack.config.js文件中) }。击中端口8080上运行的实际服务器时,路由按预期工作。