2014-05-12 275 views
11

所以,我被告知在nodeJS中傳遞變量request和or response是「不好的做法」。但是這意味着你的大部分代碼都必須放在server.js文件中,這使得它變得雜亂而且很醜陋。NodeJS模塊化

如何模塊化您的nodejs服務器,恰當地傳遞req/res並能夠將您的代碼組織到單獨的文件中?

例如,我想我的插座路由,.get.post分裂成不同的文件,但仍然可以使用回調參數,像這樣:

app.io.route("disconnect", function(req,res) { <--- these params 
    db.query("UPDATE player_data SET online=0 WHERE id="+mysql.escape(req.session.user)); 
    req.io.broadcast("event", {msg:req.session.username+" has logged out!"}); 
    app.io.broadcast("reloadXY"); 
}); 

截至目前他們都在一個文件中,我不喜歡那樣。

回答

7

我想通過 '繞過' 的含義的人是這樣的(在普通快遞):

app.get('/kittens', function(req, res) { 
    db.doAthing(req); 
    updateSomethingElse(res); 
    upvoteThisAnswer(res); 
}); 

也就是說,圍繞兩個變量超過第一個函數。這很糟糕,因爲越來越難找出通話實際結束的地方。一個小小的res.end(500)updateSomethingElse可以導致整個房子的卡來了。

這是完全正常(其實,標準的是快遞默認的點)來聲明回調別處(通常是/routes目錄中的項目。)

// app.js 

var user = require('./routes/user') 
    , kittens = require('./routes/kittens'); 

// express stuff... 

app.get('/settings', user.getSettings); 
app.get('/fur', kittens.shed); 

然後,在routes/user.js

exports.getSettings = function(req, res) { 
    // Note how we're passing around properties of req/res, not the objects themselves. 
    db.getUserSettings(req.user.id).then(function(settings) { 
    res.render('settings', settings); 
    }); 
}; 
0

您不應將req和res傳遞給另一個模塊,而應將其他模塊的回調傳遞給其他模塊。 它應該看起來像。

var someModule = require("./someModule") 

app.get("/someAction", someModule.handleSomeAction) ; 

如果你想擁有的職位,而在另一個模塊,您應該通過參考應用程序獲得(從快車())一次該模塊上運行。

例如:

var express = require("express") ; 
var app = express(); 
var get_handler = require("./get_handler ") 
var post_handler = require("./post_handler ") 

get_handler.init(app); 
post_handler.init(app); 

,並在後期/ get_handler:

var app; 
exports.init = function(eApp){ 
    app = eApp; 
    // operate on app 
} 
1

這部影片從TJ Holowaychuk幫我拿快遞模塊化到一個新的水平(誰寫Express和一噸的其他節點的基礎設施,我們都使用的傢伙)。基本上,您可以在各自的文件夾中製作單獨的應用程序,並將它們作爲中間件輕鬆使用。我已經設法將這種技術擴展到socket.io中,並提供了一些技巧。

http://vimeo.com/56166857

+1

補充鏈接是真棒,但不應該包含你的答案的關鍵所在。 – SomeKittens