以下两种管理route的方式,你是用哪个方式管理Nodejs项目的路由的?

以下两种管理route的方式,你是用哪个方式管理Nodejs项目的路由的?

我注意到express 生成的默认app.js中的route部分是这样写的

var app = express();
var routes = require('routes');
// 路由请求链接在这里处理,路由处理事件在routes文件里处理
app.get('/',routes.index);

但是又有些是这样写的

var app = express();
var routes = require('routes');
// 把app传入到routes文件里,routes一并处理请求链接和对应事件
routes(app);

我个人比较认同第二种方式,认为界限划分明确,会方便管理,但是不明白express默认是第一种方式,而且很多人用的也是第一种方式,

1 你用的是哪种方式? 2 为什么你选择这种方式?


6 回复

以下两种管理route的方式,你是用哪个方式管理Nodejs项目的路由的?

内容

在Express项目中,管理路由的方式有多种。以下是两种常见的方法:

  1. 第一种方式:

    var app = express();
    var routes = require('./routes');
    
    // 路由请求链接在这里处理,路由处理事件在routes文件里处理
    app.get('/', routes.index);
    
  2. 第二种方式:

    var app = express();
    var routes = require('./routes');
    
    // 把app传入到routes文件里,routes一并处理请求链接和对应事件
    routes(app);
    

我个人比较认同第二种方式,认为界限划分明确,会方便管理。

1. 你用的是哪种方式?

我通常使用第二种方式来管理路由。

2. 为什么你选择这种方式?

选择第二种方式主要有以下几个原因:

  1. 模块化清晰:通过将app对象传递给路由模块,可以更好地组织代码。每个路由模块只关注其自身的逻辑,而不需要关心如何与app对象交互。

  2. 易于维护:当路由逻辑变得复杂时,这种方式使得代码更加模块化,便于维护和扩展。例如,可以轻松地添加新的路由或修改现有路由,而无需担心其他地方的代码受到影响。

  3. 更好的分离关注点app对象的创建和配置可以在主文件中完成,而路由的定义和处理可以在单独的文件中进行。这有助于保持代码结构清晰,提高可读性和可维护性。

示例代码

假设我们有一个简单的Express应用,并且我们使用第二种方式来管理路由。

主文件 app.js:

const express = require('express');
const routes = require('./routes');

const app = express();

// 其他中间件和配置
app.use(express.json());

// 将app对象传递给路由模块
routes(app);

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}`);
});

路由文件 routes.js:

module.exports = function(app) {
  app.get('/', (req, res) => {
    res.send('Hello World!');
  });

  app.get('/about', (req, res) => {
    res.send('About Page');
  });
};

通过这种方式,路由的定义和处理逻辑都在routes.js文件中完成,而主文件app.js则专注于创建和配置Express应用。这样可以更好地组织代码,使其更易于维护和扩展。


当你有五六十个 route 的时候,第二种方便管理。

先用着第一种就好了,这个五分钟就重构完了。

貌似express的项目上还提供了很多router的例子

真的耶!

第一种方式,然后每一个部分的route创建一个 app,然后让一个总的 app 吧这些 app 当作中间件use起来就好了:

subapp

var app = module.exports = express();
var ctrl = require('./bleh');
// 路由请求链接在这里处理,路由处理事件在routes文件里处理
app.get('/bleh',ctrl.all);

subapp2

var app = module.exports = express();
var ctrl = require('./bla');
// 路由请求链接在这里处理,路由处理事件在routes文件里处理
app.get('/bla',ctrl.all);

mainapp

var blehapp = require('./blehapp');
var blaapp = require('./blaapp');
var app = express();

app.use(blehapp); app.use(blaapp);

这样每一个app就对应各自的路由啦 :D

在这个问题中,两种管理路由的方式各有优劣。我将解释这两种方式,并提供示例代码以帮助理解。

第一种方式:在 routes 文件中单独定义路由

var app = require('express')();
var routes = require('./routes');

app.get('/', routes.index);

routes/index.js 文件中:

exports.index = function(req, res) {
    res.send('Hello World');
};

第二种方式:直接在 routes 文件中处理请求

var app = require('express')();
var routes = require('./routes')(app);

routes/index.js 文件中:

module.exports = function(app) {
    app.get('/', function(req, res) {
        res.send('Hello World');
    });
};

我倾向于使用第二种方式

原因

  1. 清晰性:第二种方式使得路由逻辑更集中,避免了 app.get() 分散在不同的地方。
  2. 可维护性:将路由逻辑集中在一处有助于管理项目结构,特别是当项目变得复杂时。
  3. 灵活性:这种方式更容易扩展,例如,可以很容易地为每个路由添加中间件或进行其他配置。

总的来说,虽然第一种方式在Express默认模板中被广泛使用,但第二种方式在实际开发中更能提升代码的可读性和可维护性。

回到顶部