📌  相关文章
📜  为什么 Express 'app' 和 'server' 文件分开保存?

📅  最后修改于: 2022-05-13 01:56:35.844000             🧑  作者: Mango

为什么 Express 'app' 和 'server' 文件分开保存?

Express 是 Node.js 中用于 Web 应用程序的简单而简约的框架。 Express 为 Web 和移动应用程序的开发提供了丰富的功能集合。在任何 web 或移动应用程序中,每个模块或层应该只负责一个任务,而不应该处理其他任务。这允许将应用程序分解为更小的构建块,这有助于降低代码复杂性和从其他层抽象出来的数据。

将类似的概念应用于 Express 的项目结构,应用程序逻辑与服务器的分离允许代码模块化并遵循 MVC(模型-视图-控制器)模型。分离对于减少耦合以及封装和抽象应用程序内部逻辑是必不可少的。

Express 中的每个组件及其职责如下所述:

服务器:服务器仅负责中间件的初始化、设置引擎以及发出请求的路由。这些路由由主应用程序或函数逻辑组成。
下面是进入 server.js 文件的代码片段。

// A function to initialize the server
// configuration, middleware and routes
const server = express();
  
create = function (config) {
      
    // Get routes from routes directory
    let routes = require('./routes');
  
    // Configure the server settings
    server.set('env', config.env);
    server.set('port', config.port);
    server.set('hostname', config.hostname);
  
    // Returns middleware that parses json
    server.use(bodyParser.json());
  
    // Set up routes for the server
    routes.init(server);
};

应用程序: “应用程序”文件包含 Web 应用程序的主要业务逻辑,并负责其执行。它还包含对后端数据库和数据模型的访问。 “应用程序”由两个主要组件组成——路由和控制器。这些将在下面讨论。

  • 路由:顾名思义,路由负责定义应用程序中的路由。在routes/index.js中定义路由的代码片段。
    // routes/index.js
    server.get('/', function (req, res) {
      
        // Redirect request to /home route 
        res.redirect('/home');
    });
      
    server.use('/home', apiRoute);
    server.use('/contact_us', homeRoute);
    server.use('/about', errorRoute);
    
  • 控制器:控制器包含要执行的逻辑。它们还控制呈现的视图。用于定义控制器的代码片段。
    // controllers/home.js
    function index (req, res) {
        console.log("On the home page");
      
        // Write any other application logic here...
    }
    

“服务器”和“应用程序”分离的优点:

  • 数据抽象和封装:虽然服务器仅包含处理服务器配置、设置中间件和初始化路由的逻辑,但应用程序负责应用程序逻辑并从服务器层抽象数据模型和业务逻辑。这确保了数据库/数据从服务器层抽象出来并由应用层封装。
  • 模块化:通过保持服务器和应用程序功能分开,代码被分成多个模块,每个模块都有一个任务或责任来执行。这些可以在需要时单独使用,因为模块之间的依赖关系减少了。通过明确的逻辑分离可以避免重复代码。
  • 可扩展性:每个单独的组件都被分配了一个独特的职责。这允许快速进行更改,而无需在代码中的任何地方进行更改。例如,考虑要更改的模块的逻辑,该模块在其他几个功能中用作子模块。如果逻辑是一个单独的模块,则只需在该模块中进行更改,而不是在其中使用逻辑的所有功能中进行。
  • 可重用性:由于应用程序被划分为分配给单个任务的多个模块,因此可以在需要时在应用程序中多次重用它们。例如,需要多次将分钟转换为秒的应用程序可能会将这种转换定义为单独的函数,以避免在整个应用程序中一遍又一遍地重写逻辑的麻烦。