因此,有人告诉我,在request和或response变量中传递nodeJS是“不好的做法”。但这意味着您的大部分代码必须在server.js文件中,这使得它变得杂乱无章,有点难看。
如何模块化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");
});现在他们都在一个文件里,我不喜欢这样。
发布于 2014-05-12 17:55:14
我认为这个人所说的“四处走动”的意思是这样的(直截了当的):
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);
});
};发布于 2014-05-12 18:02:06
这段来自TJ Holowaychuk的视频帮助我将Express模块化提升到了一个更高的水平。基本上,您可以在自己的文件夹中制作单个应用程序,并将它们作为中间件使用。我已经用一些技巧将此技术扩展到socket.io。
http://vimeo.com/56166857
发布于 2014-05-12 09:42:53
不应将req和res传递到另一个模块,而应将来自另一个模块的回调传递到路由。它应该看起来像。
var someModule = require("./someModule")
app.get("/someAction", someModule.handleSomeAction) ;如果您希望有post并进入另一个模块,您应该将app (从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_处理程序中:
var app;
exports.init = function( eApp){
app = eApp;
// operate on app
} https://stackoverflow.com/questions/23603803
复制相似问题