如何模块化 Node 和 Express 应用程序?

2023-11-29

我使用 server.js 作为我的 nodejs-expressjs 应用程序中的主文件。在客户端,我使用 Angular JS 进行模板化(不在服务器端使用 JADE/EJS)。我想在服务器上模块化这个 server.js 文件,因为如果我的应用程序增长,它可能会不好。

var express = require('express');
var app = express();
var fs = require("fs");

/**
 *  Session
 */
var session = require('express-session');
app.use(session({secret: '!23',resave: false,saveUninitialized:false}));


var bodyParser = require('body-parser');
var mysql      = require('mysql');
var async      = require('async');

/**
 * Connect to MySQL
 */
var config = require("./config");
var db = config.database;
var connection = mysql.createPool(db);

app.use( bodyParser.json() );  

// Create application/x-www-form-urlencoded parser
var urlencodedParser = bodyParser.urlencoded({ extended: false });

/**
 *  Provide web directory
 */
app.use(express.static('public'));


app.post('/abc', function (req, res) {
   //code 
});
  app.post('/xyz', function (req, res) {
   //code 
});
 app.post('/test', function (req, res) {
   //code 
});
var server = app.listen(config.port);

假设我想在一个单独的文件(例如 test.js)中添加以下方法。我该怎么做呢?

 app.post('/test', function (req, res) {
       //code 
    });

在主模块 server.js 中: 消除 :

app.post('/abc', function (req, res) {
   //code 
});
  app.post('/xyz', function (req, res) {
   //code 
});
 app.post('/test', function (req, res) {
   //code 
});

并更改为

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

在同一目录中创建文件 router.js 并添加:

var express = require('express');
var router = new express.Router();
router.post('/abc', function (req, res) {
   //code 
});
router.post('/xyz', function (req, res) {
   //code 
});
router.post('/test', function (req, res) {
   //code 
});
module.exports = router;
Edit1:

您可以将路线拆分为多个文件(在大型应用程序中可能有数百条路线)。实现它的策略很少,我展示一个:

创建新文件,在其中配置更多路由(例如,routes/route1.js、routes/route2.js): 在router.js中添加:

router.use(require("./routes/route1"));
router.use(require("./routes/route2"));

在路由 1.js 和路由 2.js 中创建与 router.js 类似的结构:

var express = require('express');
var router = new express.Router();
//place for routes
module.exports = router;

Edit2:OP在评论中提出了一个问题:

但是如果我连接到 sql 并在每个模块中使用查询那么为什么我要这样做 需要在每个模块中添加mysql连接代码吗?

当我们将代码拆分为多个模块时,我们应该尽量减少依赖。但是每个模块中的多个连接或其他资源匮乏的任务可能不是一个糟糕的选择。

我们可以在多个模块中共享公共资源实例。完成这项任务的方法有很多种。

我将只向您展示基本的(我将忽略全局污染):

假设我们有对象myCommonObjectInstance,我们需要将它传递给多个模块

1)在主模块中(服务器.js):

app.set('someName',myCommonObjectInstance);

现在在路线中您可以执行以下操作:

router.post('/test', function (req, res) {
   var myCommonObjectInstance = req.app.get('someName');
  //other code
});

2)在主模块中(服务器.js)让我们创建中间件,将新属性添加到 req 或 res:

app.use(function(req,res,next){
  req.myCommonObjectInstance = myCommonObjectInstance;
  next();//very important!!!
});

现在在你的路线模块中:

router.post('/test', function (req, res) {
   var myCommonObjectInstance = req.myCommonObjectInstance; 
  //other code
});

3)第三种流行的方法是注入模块,查看这篇文章了解更多详细信息:https://stackoverflow.com/a/9700884/4138339
简而言之,您创建模块并使用参数导出函数。当您在主模块中导入函数时,您会传递参数。

你的模块之一

module.exports = function (myCommonObjectInstance) {
//your code and you have access to myCommonObjectInstance
};

在主模块中

require('./yourmodule')(myCommonObjectInstance);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何模块化 Node 和 Express 应用程序? 的相关文章

随机推荐