2015-10-13 78 views
3

我已將server.js作爲我的nodejs-expressjs應用程序中的主要文件。在客戶端,我使用角度js模板(不使用服務器端的JADE/EJS)。我想在服務器上模塊化這個server.js文件,因爲如果我的應用程序增長,它可能不太好。如何模塊化nodejs + expressjs代碼

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 
    }); 

回答

4

在你的主模塊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:

您可以將您的路線分成多個文件(在大型應用程序中可能有數百條路線)。有一些策略如何使它,我展示一個:

創建新的文件,你的配置更多的途徑(如路由/ route1.js,路線/ 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問在評論一個問題:

but if i connect to sql and use queries in every module then why do i need to add mysql connection code in every module?

當我們將代碼拆分爲多個模塊時,我們應儘可能少地依賴。但是,每個模塊中的多個連接或其他資源匱乏的任務可能是一個糟糕的選擇。

我們可以在多個模塊中共享公共資源實例。如何完成這項任務有很多種方法。

我會告訴你僅僅是基本的那些(我會忽略全局污染):

讓我們假設我們有對象myCommonObjectInstance,我們需要將它傳遞給主模塊中的多個模塊

1) (server.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); 
+0

當我在主server.js文件中使用app.use它拋出s TypeError:app.use()需要中間件函數 – John

+0

app.use必須具有require('yourroutemodule')作爲參數,而yourroutemodule必須具有'''var express = require('express');'''var router = new express.Router();''' '''module.exports = router;'''你的錯誤意味着你不能將模塊傳遞給你的app.use –

+0

是的,解決了問題謝謝,但如果我連接到SQL和在每個模塊中使用查詢,那麼爲什麼我需要在每個模塊中添加mysql連接代碼?不能我在server.ja有共同的代碼? – John

0

我通常把我的所有路由在分離的文件(例如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); 
    }); 
});