NodeJS模块化

所以,我被告知在nodeJS中传递request和/或responsevariables是“不好的做法”。 但是这意味着你的大部分代码必须放在server.js文件中,使得它变得混乱和糟糕。

你怎样才能模块化你的nodejs服务器,恰当地传递req/res并且能够把你的代码组织成单独的文件?

例如,我想将我的套接字路由, .get.post分成不同的文件,但仍然可以使用如下的callback参数:

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

截至目前,他们都在一个文件,我不喜欢这样。

我认为这个人所说的“传递”是这样的(简单expression):

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

也就是说,通过第一个函数之外的两个variables。 这很糟糕,因为越来越难找出通话实际结束的地方。 有一点res.end(500)updateSomethingElse可以导致整个房子的卡来了。

在其他地方(通常是项目的/routes目录)声明这个callback是完全可以的(事实上,作为快速默认的标准)。

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

TJ Holowaychuk(这个写Express的人和我们所用的大量其他Node基础设施)的video帮助我将Express模块​​化带到了一个新的水平。 基本上你可以在自己的文件夹中制作单独的应用程序,并非常容易地将它们作为中间件使用 我已经设法将这个技术扩展到socket.io的一些技巧。

http://vimeo.com/56166857

您不应将req和res传递给另一个模块,而是将其他模块的callback传递给另一个模块。 它应该看起来像。

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

如果你想有post并进入另一个模块你应该将引用的应用程序(从express()) 一次传递给该模块并对其进行操作。

例如 :

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

并在post / get_handler中:

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