将路线移动到 Express.js 中的文件中

Move routes into files in Express.js

假设我有一些路线(我还有很多,但这应该解释):

router.post('/post');
router.get('/post/:id');
router.get('/posts/:page?');
router.get('/search');

对于 /post 我知道我可以做类似的事情

app.use('/post', postRoutes)

其中 postRoutes 是另一个文件中的实际 post 路由。但是,我想将 all post 相关路线分组到 postRoutes 组件中(因此 /post/posts),搜索进入搜索组件等。有没有办法做类似

的事情
router.use(postRoutes); // includes routes 1-3 above
router.use(searchRoutes); // only the 4th route above

等等?这会让我保持顶层文件更干净。

您可以通过创建一个特殊的路由文件来做到这一点。这是此类文件的示例

module.exports = (function() {
    var express = require('express');
    var router = express.Router();

    router.get("/:id", function (request, response, next) {
        request.body.id = request.params["id"];
        // Do something ...
    });

    router.post("/someRoute", function (request, response, next) {
        // Do something ...
    });

    // And so on ...

    return router;
})();

接下来,在您的 server.js 文件中,像这样包含它

app.use('/post', require('./routes/postRoutes'));

是的,很简单。您甚至可以制作更多的嵌套层级。我认为将路线分开很好,尤其是当你有几十条路线时。 在您的第一个文件中 (server.js)

app.use(require("./allpost"));
app.use(require("./allqueries"));

在allpost.js

var express = require('express');
var router = new express.Router();
router.post('/post', function (req, res) {
   //your code 
});
router.get('/post/:id', function (req, res) {
   //your code 
});
router.get('/posts/:page?', function (req, res) {
   //your code 
});

当你想要更多嵌套时

router.use(require("./deeper"));

或者当你想使用路径部分时

router.use("/post2/", require("./messages/private"));
module.exports = router;

问题是我想错了。首先,不要使用单数和复数。这让人很头疼,也让人很难记住API。

一旦我使用了所有复数形式,我的 index.js 文件中就有了这样的设置:

// The API routes all start with /api and we pass app here so we can have some
// sub routes inside of api
app.use('/api', require('./app/api')(app));

然后在我的 api/index.js

var express = require('express');
var router = express.Router({ mergeParams: true });

var routeInit = function (app) {
  app.use('sessions', require('./sessions')(router));
  app.use('users', require('./users')(router));
  return router;
};

module.exports = routeInit;

你可以看到我每次都是手动通过路由器。最后:

var routeInit = function (router) {
  router.post('/blah', function (req, res, next) {
    // Do stuff
  });

  return router;
};

module.exports = routeInit;

这让我可以无限深入地嵌套路由。