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

标签 javascript node.js express

我已经创建了一个 nodeJS 应用程序,它需要创建一个可以正常工作的服务器,在文件 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);
    }
}

而在 Action js中,我做了以下操作:

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;

server.js

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

关于javascript - 如何在层之间传递 http 服务器变量,而不是将其用作 node.js 中不同文件中的 require 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32881454/

相关文章:

javascript - TypeScript - 强制执行对象中特定键的类型

javascript - jQuery 插件创作和命名空间

javascript - 在 angularJS 中从 View 调用函数 = 性能不佳?

javascript - 分页 API 过滤后的 axios 结果数组为空

node.js - Mongoose/Mongodb 更新返回值及错误处理

javascript - 剑道 UI 网格 : How to change the style of the scroll bar?

javascript - 在异步函数内调用异步函数时发生事务完成错误

node.js - 如何从打包的Electron应用程序运行可执行文件

javascript - Express/Nodejs 路由无法获取对象中的键

node.js - Express-Session、Connect-Redis 和 einaros/ws