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

uqjltbpv  于 2023-01-16  发布在  Node.js
关注(0)|答案(3)|浏览(170)

我使用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 
    });
a14dhokn

a14dhokn1#

在主模块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;

编辑1:
你可以将你的路线分割成多个文件(在大的应用程序中可能有数百条路线)。有几个策略如何使它,我展示一个:
创建可配置更多路由的新文件(例如routes/route1.js、routes/route2.js):在router.js中添加:

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

在route1.js和route2.js中创建与router.js类似的结构:

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

Edit2:OP在评论中提出了一个问题:
但是如果我连接到sql并在每个模块中使用查询,那么为什么我需要在每个模块中添加mysql连接代码呢?
当我们把代码分割成多个模块时,我们应该尽可能地减少依赖性,但是在每个模块中使用多个连接或其他资源消耗任务可能是一个糟糕的选择。
我们可以在多个模块中共享公共资源示例。有很多种方法可以完成这个任务。
我将向您展示最基本的(我将忽略全球污染):
假设我们有一个对象myCommonObjectInstance,需要将它传递给多个模块
1)在主模块(server.js)中:

app.set('someName',myCommonObjectInstance);

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

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

2)在主模块(server.js)中,让我们创建向请求或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);
2cmtqfgy

2cmtqfgy2#

我通常将我的所有路由放在routes文件夹中的单独文件(例如users.js、workplaces.js等)中,然后使用fs包将它们包含在我的主文件中,然后

/**
 * Register Routes Folder For Including New Routes
 */
fs.readdir('./routes', function(err, files){
    files.forEach(function(fn) {
        if(!/\.js$/.test(fn)) return;
        require('routes/' + fn)(app, io);
    });
});
afdcj2ne

afdcj2ne3#

将此用于脚手架:https://expressjs.com/en/starter/generator.html
app.js将所有内容路由到一个路由定义文件。

app.use('/api',require('./routes/api/allRoutes'));

allRoutes.js has all route definitions with controllers definitions

var roleCtrl=require('../master/role');
router.route('/role').post(roleCtrl.create);
router.route('/role/:roleId?').get(roleCtrl.retrieve);

我的role.js如下所示:

const {ObjectId} = require('mongodb');

    module.exports =roleObj=
        {       
            collection: require(__basedir+'/config/config').clientName +'role',

            create: function (req, res) {

                var db = req.app.db;

                var role =
                    {
                        roleName: req.body.roleName,
                        documentStatus:req.body.documentStatus||null,          
                        auditTrail :[ {timeStamp:null , userID:null, userName:null , change:null } ]

                    };        
                db.collection(roleObj.collection).insertOne(role).then(function(result)
                {
                    var response={_id:result.insertedId, message:"inserted", success:true};
                    res.send(response);
                });

            },

            retrieve: function (req, res) {

                var db = req.app.db;

                var input = {};

                if (req.params.roleId != undefined)
                   input['_id'] = ObjectId(req.params.roleId);

                db.collection(roleObj.collection).find(input).toArray(function (err, result) 
                {

                    if (result.length != 0) res.send(result);

                    else res.send("empty");

                });          
            }
        }

相关问题