如何在层之间传递http服务器variables,而不是将其作为node.js中不同文件中的require语句使用?

我已经创build了一个nodeJS应用程序,它需要创build一个服务器,在server.js文件中可以像下面这样工作:

http.createServer(app).listen(app.get('port'), function (err) { if (err) { console.error(err); } else { runProcess(); console.log('Server listening on port ' + app.get('port')); } }); 

现在我需要通过这个服务器到一些文件,我的应用程序内置如下:

 server.js app.js routes.js action.js 

所以我做了如下的快速, 有没有更好的方法来做到这一点?

这是更改后的server.js

 var server = http.createServer(app); app.setServer(server); server.createServer(app).listen(app.get('port'), function (err) { if (err) { console.error(err); } else { runProcess(); console.log('Server listening on port ' + app.get('port')); } }); 

app.js我有路由器文件,我喜欢以下内容:

 app.use('/', routes.router, function (req, res, next) { next(); }); app.setServer = function(http) { routes.setServer(http); } module.exports = app; 

我把这个代码放在router.js文件中:

 module.exports = { router: applicationRouters, setServer: function(http) { //here I set server to the file action.js action.setServer(http); } } 

而在js的行动中,我做了以下几点:

 module.exports = { setServer: function(http) { ... 

我需要通过层之间的http,而不是在不同的文件/模块中使用它作为要求。 我如何在node.js中做到这一点?

如果我找对了,你想要做的就是将一个实例传递给其他模块,而不必要求或重新初始化它们。

server.js

 module.exports = (function () { // create the server var http = require('http'), express = require('express'), app = express(), server = http.createServer(app); server.listen(80, function () { // require and invoke the modules that need this http/server instance here require('router')(server); require('action')(server); }); }()); 

router.js

 module.exports = function (server) { // use server here.. }; 

action.js

 module.exports = function (server) { // use server here.. }; 

所以你要做的是,首先在主模块中声明和初始化对象,然后传递给你。 然后在辅助模块中,您只需将该对象作为参数来声明模块。 最后,你只需要一次在你的主模块(在这种情况下是server.js)。

注1 :我将httpvariables重命名为server以防止与http内置模块混淆。

注2 :完全初始化对象后,不要忘记需要这些模块。 例如,如果这是你的例子中的http服务器,那么在创build服务器之后并在listencallback中,最好还是需要其他模块。

注3 :你的代码; 改变之后,看起来不正确。 你调用var server = http.createServer()然后再次调用server.createServer()

您不需要将服务器传递给路由。 只需在创build服务器之前添加它们即可:

someroute.js

 var router = require("express").Router(); router.use('/', routes.router, function (req, res) { return res.json(); }); module.exports = router; 

server.js

 var app = express(); .... var someroute = require("./routes/someroute"); app.use("/someroute", someroute); server.createServer(app); 

根据反馈更新答案:

在你的server.js文件中,你可能有一个variables在初始化的时候持有socket.io实例,我们称之为io

您将像这样初始化iovariables:

 //example taken from socket.io front page var io = require('socket.io')(80); 

注册中间件时,可以将这个variables附加到req ,并在路由中使用它:

 //this goes prior to your route registration app.use(function(req, res, next) { req.io = io; }); 

在路由中,你将把req.io作为一个套接字实例:

 router.use('/', routes.router, function (req, res, next) { req.io.emit("something", {}); });