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

Javascript 如何在层之间传递http服务器变量,而不将其用作node.js中不同文件中的require语句?,javascript,node.js,express,Javascript,Node.js,Express,我已经创建了一个nodeJS应用程序,它需要创建一个正常工作的服务器,如file server.js中的以下内容: http.createServer(app).listen(app.get('port'), function (err) { if (err) { console.error(err); } else { runProcess(); console.log('Server listening on port ' +

我已经创建了一个nodeJS应用程序,它需要创建一个正常工作的服务器,如file 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
app.use('/', routes.router, function (req, res, next) {
    next();
});

app.setServer = function(http) {
    routes.setServer(http);
}

module.exports = app;
module.exports = {
    setServer: function(http) {
...
因此,我很快就做到了,如下面所示,有更好的方法吗?

这是更改后的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中,我得到了路由器文件,我喜欢以下内容:

server.js 
 app.js
  routes.js
   action.js
app.use('/', routes.router, function (req, res, next) {
    next();
});

app.setServer = function(http) {
    routes.setServer(http);
}

module.exports = app;
module.exports = {
    setServer: function(http) {
...
我将此代码放入router.js文件中:

module.exports = {
    router: applicationRouters,
    setServer: function(http) {
        //here I set server to the file action.js
        action.setServer(http);
    }
}
在动作js中,我做了以下几点:

server.js 
 app.js
  routes.js
   action.js
app.use('/', routes.router, function (req, res, next) {
    next();
});

app.setServer = function(http) {
    routes.setServer(http);
}

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

我需要在层之间传递http,而不是在不同的文件/模块中使用它。如何在node.js中实现这一点?

您不需要将服务器传递给路由。只需在创建服务器之前包含它们:

someroute.js

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

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

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

module.exports = router;
var app = express();
....
var someroute = require("./routes/someroute");
app.use("/someroute", someroute);
server.createServer(app);
根据反馈更新答案:

server.js文件中,您可能有一个变量来保存初始化时的
socket.io
实例,我们称之为
io

您将初始化
io
变量,如下所示:

//example taken from socket.io front page
var io = require('socket.io')(80); 
注册中间件时,您可以将此变量附加到
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", {});
});

如果我没弄错的话,您所要做的就是将实例传递给其他模块,而不必要求或重新初始化它们

server.js

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

module.exports = router;
var app = express();
....
var someroute = require("./routes/someroute");
app.use("/someroute", someroute);
server.createServer(app);
module.exports=(函数(){
//创建服务器
var http=require('http'),
express=require('express'),
app=express(),
server=http.createServer(app);
监听(80,函数(){
//此处需要并调用需要此http/server实例的模块
需要(‘路由器’)(服务器);
要求(‘操作’)(服务器);
});
}());
router.js

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

module.exports = router;
var app = express();
....
var someroute = require("./routes/someroute");
app.use("/someroute", someroute);
server.createServer(app);
module.exports=函数(服务器){
//在此处使用服务器。。
};
action.js

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

module.exports = router;
var app = express();
....
var someroute = require("./routes/someroute");
app.use("/someroute", someroute);
server.createServer(app);
module.exports=函数(服务器){
//在此处使用服务器。。
};
因此,您要做的是,首先在主模块中声明并初始化要传递的对象。然后在二级模块中,您只需使用将此对象作为参数的签名来声明模块。最后,在主模块(本例中为server.js)中只需要它们一次

注意1:我将
http
变量重命名为
server
,以防止与
http
内置模块混淆

注意2:在完全初始化对象后,不要忘记需要这些模块。e、 g.如果这是一个http服务器,如您的示例所示,您最好在创建服务器后,在
listen
回调中需要其他模块


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

在新的server.js中,您有
server.createServer(app)
。这是一个打字错误吗?有几个问题:上面的评论员指出了什么似乎是一个打字错误;这意味着这个代码实际上不起作用;其次你是在寻找“样式点”还是“工作”方法实际上不适合你有合理的原因?@GeorgeStocker-我需要在层之间传递它(http),而不是在其他文件中使用它…知道什么是正确的方法吗?@GeorgeStocker-你能取消保留吗,我在这里需要帮助,这不是小事……我想在上面加上赏金,也许可以帮助我解决我的问题,因为正如你所看到的,这篇文章被很多人读过,但只有一个答案没有多大帮助……@马克,你的标题不是很清楚;你的问题也不是。我改进了这两个并重新打开了它。下次你问问题时,要特别注意这两个部分,因为这可以避免您的问题被关闭。谢谢,但我需要在层之间传递http,而不是在不同的文件/模块中按要求使用它…知道如何正确地做到这一点吗?我需要它来支持WebSocket,而在我这样做之前它不起作用,就像我在文章中提到的,现在它起作用了…我想知道是否有更好的方法在层之间传递它从服务器到应用程序再到路由器和action.js的层?您可以将socket config放入另一个文件中,并在任何地方都需要它,或者,您可以将套接字连接到中间件中的
req
参数,并在您的路由中使用它,如
req.io
不确定我是否得到了它,您可以提供它作为答案,请,我将很快尝试它…非常感谢Vsevolod 1+,当前我没有使用基于节点http代理的套接字IO,我的问题是如何在层间传递http比我在文章中提供的更好,有更好的方法吗?您只需将我的代码从服务器传递到操作文件…谢谢!谢谢1+,我会很快尝试并让你知道…两个问题1。您的解决方案不是在操作和作为程序起点的server.js文件之间创建depandency?2。你能为你的第二个笔记提供一个例子吗?@Mark,因为在你的例子中,server.js是起点,是主模块。我已经在我的回答中更新了这个例子。谢谢,但是你认为这是正确的方法吗,因为我已经在服务器和动作JS之间创建了依赖关系??好吧,我的建议并没有强制执行这种依赖关系。action.js显然需要
服务器
实例,因为您有一个
.setServer()
方法。所以不是这样;这使您能够只初始化实例一次,并在模块之间传递它。您只需使用
server
参数调用这些模块;在我看来,哪个更合适、更优雅。