Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 节点模块化_Javascript_Node.js_Express_Modularity - Fatal编程技术网

Javascript 节点模块化

Javascript 节点模块化,javascript,node.js,express,modularity,Javascript,Node.js,Express,Modularity,因此,我被告知在nodeJS中传递请求和/或响应变量是“糟糕的做法”。但这意味着您的大部分代码必须在server.js文件中,这使得它变得杂乱无章,有点难看 如何将nodejs服务器模块化,适当地传递req/res,并将代码组织到单独的文件中 例如,我想将套接字路由、.get和.post拆分为不同的文件,但仍然可以使用如下回调参数: app.io.route("disconnect", function(req,res) { <--- these params db.query("

因此,我被告知在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");
});

app.io.route(“disconnect”,function(req,res){您不应该将req和res传递给其他模块,而应该将来自其他模块的回调传递给route。
应该是这样的

var someModule = require("./someModule")

app.get("/someAction", someModule.handleSomeAction) ;
如果你想发布并进入另一个模块,你应该将对app的引用(from 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 
} 

我认为这个人所说的“路过”的意思是这样的(简单地说):

也就是说,在第一个函数之外传递两个变量。这是不好的,因为它越来越难以确定调用的实际结束位置。在
updateMethingElse
中只需一点
res.end(500)
,就会导致整个纸牌屋倒塌

在其他地方(通常是项目的
/routes
目录)声明回调是完全可以的(事实上,标准到express中的默认值)

然后,在
路由/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和大量其他我们都使用的节点基础设施的人)帮助我将快速模块化提升到了一个新的水平。基本上,你可以在自己的文件夹中创建单独的应用程序,并将其作为中间件使用。我通过一些技巧成功地将此技术扩展到socket.io


补充链接很棒,但不应包含您答案的关键。
// app.js

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

// express stuff...

app.get('/settings', user.getSettings);
app.get('/fur', kittens.shed);
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);
  });
};